如何在Python中存储没有日期的时间,以便比较方便?

时间:2016-04-05 00:03:37

标签: python datetime

我有一个简单的任务,即在服务器的时区存储时间,然后比较当前时间是否在节省的时间之后或之前。

我尝试将时间存储为“需要时间的”2008年1月1日“日期。如果我在1月1日保存“16:00”并尝试将它与4月1日的“16:00”进行比较,那么问题就是夏令时会受到影响,我会得到一个小时的差异。我希望“16:00”总是指当天的“16:00”。

什么是存储和比较当天时间和忽略日期的有效和可靠的方法?我需要它也是json-serializable,所以如果需要的话我可以很容易地操作python和JS中的值。

2 个答案:

答案 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)