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

ser*_*erg 2 python datetime

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

我尝试将时间与所需时间存储为“ 2008年1月1日”。问题是,夏令时变得有些麻烦,如果我在1月1日保存“ 16:00”并尝试将其与4月1日的“ 16:00”进行比较,我会得到一个小时的差异。我希望“ 16:00”始终表示当天的“ 16:00”。

存储和比较一天中的时间并忽略日期的有效而可靠的方法是什么?我还需要它可以json序列化,因此如果需要,我可以轻松地在python和JS中操纵该值。

Pau*_*aul 7

随心所欲地存储它,然后使用对象的.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
Run Code Online (Sandbox Code Playgroud)

如果您想对它们进行“挂钟”算术(而不是“时间线”算术,应该使用 UTC 完成),您也可以将日期时间转换为简单的日期时间对象datetime

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)
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 5

我还需要它可以json序列化,因此如果需要,我可以轻松地在python和JS中操纵该值。

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

我希望“ 16:00”始终表示当天的“ 16:00”。

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

import time

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

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

要将其解析为时间,datetime对象:

from datetime import datetime

four_pm_time = datetime.strptime('16:00', '%H:%M').time()
four_pm = datetime.combine(datetime.now(), four_pm_time)
Run Code Online (Sandbox Code Playgroud)

要获取时区感知日期时间对象:

import tzlocal # $ pip install tzlocal

four_pm_aware = tzlocal.get_localzone().localize(four_pm, is_dst=None)
Run Code Online (Sandbox Code Playgroud)

要获取与下午4点相对应的Unix时间(假设mktime()在这里工作)

import time

unix_time = time.mktime(time.localtime()[:3] + (16, 0, 0) + (-1,)*3)
Run Code Online (Sandbox Code Playgroud)