如何将格式转换"%d/%m/%Y"
为时间戳的字符串?
"01/12/2011" -> 1322697600
如何将格式转换"%d/%m/%Y"
为时间戳的字符串?
"01/12/2011" -> 1322697600
Answers:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()
或.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
有点短
.timestamp()
假定使用本地时间而不是UTC。答案中的代码1322697600
仅在本地时区utc偏移为零的计算机上有效(产生预期的效果)。
要将字符串转换为日期对象:
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。任何想法?谢谢。
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
Python不支持。它不是便携式的。
答案还取决于您输入的日期时区。如果您的日期是本地日期,则可以像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
只需使用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
notint
这些答案中有很多都不必考虑日期是幼稚的
为正确起见,您需要先将天真日期设为可识别时区的日期时间
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的设置方式tzinfo
datetime.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
我建议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")
似乎相当有效:
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()
您可以参考以下链接,以使用strptime
from中的函数datetime.datetime
将日期转换为任何格式以及时区。
https://docs.python.org/3/library/datetime.html#strftime-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