Як перетворити рядок у форматі "%d/%m/%Y"в часову позначку?
"01/12/2011" -> 1322697600
Як перетворити рядок у форматі "%d/%m/%Y"в часову позначку?
"01/12/2011" -> 1322697600
Відповіді:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()or.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()трохи коротше
.timestamp()передбачає місцевий час замість UTC, якщо не вказано чіткого часового поясу. Код у відповіді працює (створює очікувані 1322697600) лише на комп’ютері, де місцевий часовий пояс має зсув нульового значення utc.
Я використовую ciso8601, що на 62 рази швидше, ніж у стриптиз дати.
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Ви можете дізнатися більше тут .
Щоб перетворити рядок в об’єкт дати:
from datetime import date, datetime
date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()
Спосіб перетворення об’єкта дати у часову позначку POSIX залежить від часового поясу. Від переходу datetime.dateдо часової позначки UTC на Python :
Об'єкт дата представляє опівночі в UTC
import calendar
timestamp1 = calendar.timegm(utc_date.timetuple())
timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
assert timestamp1 == timestamp2Об'єкт дати представляє опівночі за місцевим часом
import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())Часові позначки відрізняються, окрім опівночі в UTC та за місцевим часом - це той самий екземпляр часу.
NameError: name 'wckCalendar' is not defined. Я запускаю Python 3.4.1 на 32-бітній машині Windows. Будь-яка ідея? Дякую.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"не підтримується Python . Він не портативний.
Відповідь також залежить від часового поясу дати введення. Якщо ваша дата є місцевою датою, ви можете використовувати mktime (), як сказав katrielalex - тільки я не бачу, чому він використав datetime замість цієї коротшої версії:
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Але зауважте, що мій результат відрізняється від його, оскільки я, мабуть, в іншому TZ (а результат - часова мітка UNIX, що не має часових поясів)
Тепер, якщо дата введення вже в UTC, я вважаю, що правильне рішення:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Просто використовуйте datetime.datetime.strptime:
import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Результат:
1322697600
Щоб використовувати UTC замість локального часового поясу .replace:
datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
floatнеint
Дуже багато з цих відповідей не заважають вважати, що дата починається наївно
Для коректності вам потрібно спочатку зробити наївну дату часовим поясом
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)
# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)
# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0
Також:
Будьте обережні, використовуючи pytzдля tzinfoв datetime.datetimeроботи не для багатьох часових поясів. Дивіться дату з часовим поясом pytz. Різне зміщення залежно від способу встановлення цинфо
# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!
# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset
Я б запропонував дати :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"форматі. Порівняйте: dateutil.parser.parse("01/02/2001")іdatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600якщо ваш місцевий часовий пояс не є UTC. Дивіться мій коментар з 2014 року
Здається, це досить ефективно:
import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 мкс ± 120 нс на цикл (середнє ± ст. Розм. 7 пробігів, 100000 петель у кожному)
datetimeфункція? datetimeз datetimeбібліотеки не підтримує.timestamp()
просто використовуйте datetime.timestamp (ваш час timetime), екземпляр datetime містить інформацію про часовий пояс, тому часова марка буде стандартною позначкою часу utc. якщо ви перетворите дату в timetuple, вона втратить часовий пояс, тому результатом буде помилка. якщо ви хочете надати інтерфейс, слід написати так: int (datetime.timestamp (time_instance)) * 1000
Ви можете посилатися на наступне посилання для використання strptimeфункції з datetime.datetime, щоб конвертувати дату з будь-якого формату разом із часовим поясом.
https://docs.python.org/3/library/datetime.html#strearch-and-strptime-behavior
Проста функція, щоб отримати час UNIX Epoch.
ПРИМІТКА . Ця функція передбачає, що час дати введення в форматі UTC (див. Тут коментарі ).
def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
import datetime, calendar
ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
return calendar.timegm(ts.utctimetuple())
Використання :
>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600