关于datetime:在Python中将字符串日期转换为时间戳

Convert string date to timestamp in Python

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

1
"01/12/2011" -> 1322697600


1
2
3
4
5
>>> import time
>>> import datetime
>>> s ="01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())
1322697600.0


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

1
2
3
4
5
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时间戳:

  • date对象表示UTC的午夜

    1
    2
    3
    4
    5
    import calendar

    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • date对象表示当地时间的午夜

    1
    2
    3
    4
    import time

    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

除非UTC中的午夜和本地时间是同一时间实例,否则时间戳是不同的。


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

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

你可以在这里了解更多。


1
2
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200


答案还取决于您输入的日期时区。如果你的日期是本地日期,那么你可以使用像katrielalex所说的mktime() - 只是我不明白为什么他使用datetime而不是这个更短的版本:

1
2
>>> time.mktime(time.strptime('01/12/2011',"%d/%m/%Y"))
1322694000.0

但请注意我的结果与他不同,因为我可能在不同的TZ中(结果是无时区的UNIX时间戳)

现在,如果输入日期已经是UTC,那么我认为正确的解决方案是:

1
2
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600


只需使用datetime.datetime.strptime

1
2
3
import datetime
stime ="01/12/2011"
print(datetime.datetime.strptime(stime,"%d/%m/%Y").timestamp())

结果:

1
1322697600

要使用UTC而不是本地时区,请使用.replace

1
datetime.datetime.strptime(stime,"%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()


我建议dateutil:

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


首先,您必须使用strptime类将字符串转换为struct_time格式。

然后从那里使用mktime来获得你的浮动。


很多这些答案都没有考虑到开始时的日期是天真的

要正确,您需要先将天真日期设为时区感知日期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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对许多时区都不起作用。使用pytz时区查看datetime。不同的偏移量取决于tzinfo的设置方式

1
2
3
4
5
6
7
8
9
10
# 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://en.wikipedia.org/wiki/Local_mean_time


您可以参考以下链接,使用datetime.datetime中的strptime功能,从任何格式转换日期以及时区。

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior


似乎非常有效:

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

每回路1.61μs±120 ns(平均值±标准偏差,每次运行10次,每次100000次循环)


只使用datetime.timestamp(你的datetime instanse),datetime实例包含时区信息,所以时间戳将是标准的utc时间戳。如果你将datetime转换为timetuple,它将失去它的时区,因此结果将是错误的。
如果你想提供一个接口,你应该这样写:
int(datetime.timestamp(time_instance))* 1000