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

2024-04-27 00:03:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的任务,在服务器的时区中存储一个时间,然后比较当前时间是在保存的时间之后还是之前。

我试着把时间存储为“2008年1月1日”和我需要的时间。问题是夏令时有点碍事,如果我把1月1日的“16:00”与4月1日的“16:00”进行比较,我会得到一个小时的时差。我希望“16:00”总是指今天的“16:00”。

什么是一种有效和可靠的方式来存储和比较一天中的时间而忽略日期?我还需要它是json可序列化的,所以如果需要的话,我可以很容易地在python和JS中操作值。


Tags: 服务器json序列化方式时间js小时我会
2条回答

I need it to also be json-serializable, so I can easily manipulate the value in python and JS if needed.

"16:00"字符串可用于存储时间(如果不需要秒)。

I want "16:00" to always mean current day's "16:00".

要将其与当前时间进行比较:

import time

if time.strftime('%H:%M') < '16:00':
    print('before 4pm')
else:
    print('after 4pm')

%H%M产生零填充的十进制数,例如07,因此字符串比较工作正常。它也可以在DST转换的情况下工作(只要Clocaltime()工作)。

要将其解析为时间、日期时间对象:

from datetime import datetime

four_pm_time = datetime.strptime('16:00', '%H:%M').time()
four_pm = datetime.combine(datetime.now(), four_pm_time)

要获取时区感知的datetime对象,请执行以下操作:

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 ^{} works here)

import time

unix_time = time.mktime(time.localtime()[:3] + (16, 0, 0) + (-1,)*3)

只需根据需要存储它,然后使用datetime对象的.time()方法并进行比较。

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

如果您想对日期时间对象执行“挂钟”运算(而不是“时间线”运算,应该使用UTCdatetimes),也可以将日期时间转换为简单的日期时间对象:

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)

相关问题 更多 >