我有一个简单的任务,将时间存储在服务器的时区中,然后比较当前时间是否在保存的时间之前或之后。
我尝试将时间与所需时间存储为“ 2008年1月1日”。问题是,夏令时变得有些麻烦,如果我在1月1日保存“ 16:00”并尝试将其与4月1日的“ 16:00”进行比较,我会得到一个小时的差异。我希望“ 16:00”始终表示当天的“ 16:00”。
存储和比较一天中的时间并忽略日期的有效而可靠的方法是什么?我还需要它可以json序列化,因此如果需要,我可以轻松地在python和JS中操纵该值。
随心所欲地存储它,然后使用对象的.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)
我还需要它可以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)
| 归档时间: |
|
| 查看次数: |
8643 次 |
| 最近记录: |