在Python中将stringdate转换为时间戳

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

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

将string转换为date对象:

 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() 

将date对象转换为POSIX时间戳的方式取决于时区。 从Python将datetime.date转换为UTC时间戳 :

  • date对象代表UTC的午夜

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

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

时间戳是不同的,除非UTC的午夜和当地时间是相同的时间实例。

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

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

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

你可以在这里了解更多

答案也取决于你的inputdate时区。 如果你的date是一个本地date,那么你可以使用mktime()像katrielalex说 – 只有我不明白他为什么用date时间,而不是这个较短的版本:

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

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

现在如果inputdate已经是UTC,比我相信正确的解决scheme是:

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

首先,您必须将strptime类转换为struct_time格式。

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

我会build议dateutil :

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

很多这些答案都不用考虑date是天真的

为了正确,你需要使天真的date首先是一个时区知道的date时间

 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用于许多时区。 用pytz时区查看datetime。 取决于如何设置tzinfo不同的偏移量

 # 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.timestamp(你的date时间实例),datetime实例包含时区信息,所以时间戳将是一个标准的utc时间戳。 如果将date时间转换为timetuple,则会丢失它的时区,所以结果将是错误的。 如果你想提供一个接口,你应该这样写:int(datetime.timestamp(time_instance))* 1000