在Python中将字符串日期转换为时间戳


219

如何将格式转换"%d/%m/%Y"为时间戳的字符串?

"01/12/2011" -> 1322697600

第二个号码是多少?Unix Epoch时间?
Hasteur 2012年

4
@Hasteur,是的。第二个数字表示从unix纪元开始到指定日期之间经过的秒数。此格式也称为POSIX时间。
eikonomega13年

Answers:


316
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
假设当地时间为2011年1月12日午夜。如果输入使用UTC;您可以使用calendar.timegm().toordinal()
jfs 2013年

49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()有点短
timdiels 2014年

11
@timdiels:再次。如果未给出明确的时区,则.timestamp()假定使用本地时间而不是UTC。答案中的代码1322697600仅在本地时区utc偏移为零的计算机上有效(产生预期的效果)。
jfs

7
这不起作用:datetime.datetime.strptime(“ 2014:06:28 11:53:21”,“%Y:%m:%d%H:%M:%S”)。timestamp()追溯(最新最后调用):文件“<标准输入>”,第1行,在<模块> AttributeError的:“datetime.datetime”对象没有属性“时间戳”
兹德涅克MAXA

5
@ZdenekMaxa datetime.timestamp()仅适用于python> = 3.3版本。docs.python.org/3/whatsnew/3.3.html
joni jones

48

我使用ciso8601,它比datetime的strptime快62倍。

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

您可以在此处了解更多信息


2
这是一个很棒的建议。我只是用它,节省了执行时间的时间。
戴维(David)

3
我的天哪,这太快了
Hews 18/12/23

3
+1是因为不需要我说明时间字符串的格式是什么。
gowenfawr

40

要将字符串转换为日期对象:

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时间戳的方式取决于时区。从Python中的转换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和当地时间的午夜是同一时间实例。


当我运行本文中的示例时,出现错误:NameError: name 'wckCalendar' is not defined。我在Windows 32位计算机上运行Python 3.4.1。任何想法?谢谢。
sedeh 2014年

1
@sedeh在帖子中没有wckCalendar。检查您的代码。
jfs

确实,@ JFSebastian,我没有尝试直接致电wckCalendar。它仅显示在错误消息中。看到我的帖子在这里讨论问题。
sedeh 2014年

1
@törzsmókus:如果答案有误,那么可读性无关紧要。
jfs

1
@törzsmókus:看我的回答:它可能产生两个不同的数字。您的答案会产生一个数字而没有提及该数字。
jfs


21

答案还取决于您输入的日期时区。如果您的日期是本地日期,则可以像katrielalex所说的那样使用mktime()-只有我不明白他为什么使用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

我认为这更好。无需同时导入“时间”和“日期时间”。
kennyut

17

只需使用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()

对于一个完整的anwser你必须说,这是唯一有效的Python 3.3+
爱德华多

在第一个示例中,结果为floatnotint
CONvid19


6

这些答案中有很多都不必考虑日期是幼稚的

为正确起见,您需要先将天真日期设为可识别时区的日期时间

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“ 不工作”。请参见带有pytz时区的datetime。不同的偏移量取决于tzinfo的设置方式tzinfodatetime.datetime

# 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

https://zh.wikipedia.org/wiki/Local_mean_time


6

我建议dateutil

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

这是错误的。OP希望时间采用"%d/%m/%Y"格式。比较:dateutil.parser.parse("01/02/2001")datetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

谢谢@jfs,很好。我相应地更新了我的答案。(作为非美国人,我不会认为不合逻辑的M / D / Y格式是解析器的默认格式。)
törzsmókus17

1
1322697600除非您的本地时区是UTC,否则它不会产生预期的效果。请参阅我2014
jfs

4

似乎相当有效:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

每个循环1.61 µs±120 ns(平均±标准偏差,共运行7次,每个循环100000个)


有什么datetime作用?datetime来自datetime图书馆的内容不支持.timestamp()
Joooeey

@Joooeey:在Python 3.3或更高版本上可以。发布问题时不可用,但自2012
。– ShadowRanger

0

只需使用datetime.timestamp(您的datetime实例),datetime实例将包含时区信息,因此该时间戳将是标准utc时间戳。如果将datetime转换为timetuple,它将丢失其时区,因此结果将是错误的。如果要提供接口,则应这样编写:int(datetime.timestamp(time_instance))* 1000



0

您可以转换为isoformat

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

一个获取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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.