我有一个简单的任务,即在服务器的时区存储时间,然后比较当前时间是否在节省的时间之后或之前。
我尝试将时间存储为“需要时间的”2008年1月1日“日期。如果我在1月1日保存“16:00”并尝试将它与4月1日的“16:00”进行比较,那么问题就是夏令时会受到影响,我会得到一个小时的差异。我希望“16:00”总是指当天的“16:00”。
什么是存储和比较当天时间和忽略日期的有效和可靠的方法?我需要它也是json-serializable,所以如果需要的话我可以很容易地操作python和JS中的值。
答案 0 :(得分:3)
只需存储它,然后使用.time()
对象的datetime
方法进行比较。
from datetime import datetime
dt1 = datetime(2008, 1, 1, 16, 0, 0)
dt2 = datetime(2008, 4, 7, 13, 30, 0)
print(dt1.time() > dt2.time()) # True
如果你想对它们进行“挂钟”算术,你也可以把你的日期时间变成天真的日期时间对象(而不是“时间轴”算术,这应该用UTC datetime
来完成): / p>
from dateutil import tz
from datetime import datetime
NEW_YORK = tz.gettz('America/New_York')
dt = datetime(2008, 1, 1, 16, 0, tzinfo=NEW_YORK)
dt_naive = dt.replace(tzinfo=None) # datetime(2008, 1, 1, 16)
答案 1 :(得分:3)
我需要它也是json-serializable,所以如果需要的话我可以很容易地操作python和JS中的值。
"16:00"
字符串可用于存储时间(如果您不需要秒数)。
我想" 16:00"永远意味着当前的日子" 16:00"。
将其与当前时间进行比较:
import time
if time.strftime('%H:%M') < '16:00':
print('before 4pm')
else:
print('after 4pm')
%H
,%M
生成零填充十进制数,例如07
,因此字符串比较正常。它也可以在DST转换的情况下工作(只要C localtime()
有效)。
将其解析为时间,日期时间对象:
from datetime import datetime
four_pm_time = datetime.strptime('16:00', '%H:%M').time()
four_pm = datetime.combine(datetime.now(), four_pm_time)
获取时区感知日期时间对象:
import tzlocal # $ pip install tzlocal
four_pm_aware = tzlocal.get_localzone().localize(four_pm, is_dst=None)
To get Unix time corresponding to 4pm (assuming mktime()
works here):
import time
unix_time = time.mktime(time.localtime()[:3] + (16, 0, 0) + (-1,)*3)