如何将格式为"%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
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
的翻译是:将字符串 s 转换为 datetime 对象,再使用格式化字符串 "%d/%m/%Y" 进行转换,并返回其对应的 Unix 时间戳。 - Tim Diels.timestamp()
方法假定的是本地时间而不是UTC时间。回答中的代码只有在本地时区的UTC偏移为零的计算机上才能正常运行(产生预期的1322697600
)。 - jfs我使用ciso8601
,它比datetime的strptime快62倍。
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
datetime.fromisoformat
可以正确解析datetime.fromisoformat(str(datetime.now()))
。但是,它无法处理JavaScript的new Date().toISOString()
,后者也是ISO 8601格式。python-dateutil
更擅长猜测,但它可能会猜错区域格式。 - Polv>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
这种语法,且该语法不具备可移植性。为了保持原意,我保留了原文中的特殊符号和术语。 - jfs只需使用 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
。 - Pedro Lobitofrom 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()
datetime.date
转换为 UTC 时间戳:
日期对象表示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午夜和本地时间相同时刻。
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
但请注意,我的结果与他的不同,因为我可能处于不同的时区 (而且该结果是无时区的 UNIX 时间戳)
如果输入日期已经是 UTC 时间,那么我认为正确的解决方案是:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
针对初学者(包括我)给出一个答案:
你有一个日期字符串"01/12/2011"
。那么它可以使用格式"%d/%m/%Y"
进行编写。如果你想要将其格式化为另一种格式,比如"July 9, 2015"
,请在这里查看一个好的速查表。
导入datetime
库。
使用datetime.datetime
类来处理日期和时间的组合。
使用strptime
方法将一个字符串时间转换为一个对象时间。
最后,使用timestamp
方法将Unix纪元时间作为浮点数获取。所以:
import datetime
print( int( datetime.datetime.strptime( "01/12/2011","%d/%m/%Y" ).timestamp() ) )
# prints 1322712000
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
另外:
请注意,在datetime.datetime
中使用pytz
作为tzinfo
时,对于许多时区是不起作用的。请参见datetime with pytz timezone. Different offset depending on how tzinfo is set
# 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 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()
。 - Joooeey我建议使用dateutil:
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")
。 - jfs1322697600
。请参见我2014年的评论。 - jfs