确定当前日期的开始和结束时间(UTC -> EST -> UTC);Python

48 投票
12 回答
119179 浏览
提问于 2025-04-17 16:27

我把所有的时间都存储为协调世界时(UTC),而我的系统也是设置为UTC(尽管我在东部标准时间(EST))。

我存储的日期格式是:

Wed, 20 Feb 2013 03:51:39 +0000

不过,我想根据今天的东部标准时间来选择信息,所以我正在尝试:

  • 获取当前的UTC时间,然后转换为东部标准时间

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
    2013-02-19 23:17:20.560898-05:00
    
  • 接下来,我想获取东部标准时间一天的开始时间(2013-02-19 00:00:00.000000-05:00)和结束时间(2013-02-19 23:59:59.99999-05:00)

  • 一旦我有了这些值,我想再转换回UTC,这样我就能得到正确的东部标准时间的上下限值。

如果这样做不是最好的方法,或者我漏掉了什么(我觉得这似乎有点复杂),请帮我指点一下!

谢谢!

根据回答的更新:

d1 = datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
print d1.strftime("%m %d %Y") ; d2 = d1.replace(day=d1.day + 1) ; print d2.strftime("%m %d %Y")

这将给我

02 20 2013
02 21 2013

这是正确的。现在我需要从中生成完整的东部标准时间,然后再转换为UTC。我现在搞不定这个。实际上,我可能想在完成后转换为UTC的纪元时间戳,因为这样会让我的数据库操作变得简单(比如小于、大于、等于等)。

12 个回答

8

这只是一个部分答案,因为其他部分已经讲得很好了。我在这方面纠结了很久,因为有些技术支持包含搜索,而我不想把第二天刚开始的那一瞬间的数据也包括进去。

我快速且准确找到一天结束时间的解决方案是这样的:

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
28

使用 datetimepytz 可以解决你的问题。

def get_start_and_end():
    tz = pytz.timezone('Asia/Shanghai')
    today = datetime.now(tz=tz)
    start = today.replace(hour=0, minute=0, second=0, microsecond=0)
    end = start + timedelta(1)

    return start, end
63

获取当前时间并把它转换成UTC(协调世界时)再转成EST(东部标准时间)的第一步看起来有点没必要。你用这个时间做什么呢?

除此之外,整个过程看起来还是挺简单的。你想要得到一天的开始和结束时间,先在EST时间下创建这些时间,然后再转换成UTC。这个操作并不复杂。:-)

不过,你可能需要检查一下你的匹配逻辑,这样你就可以把今天的开始时间作为下限,把明天的开始时间作为上限,这样就不用去处理那个23:59:59.9999的时间了。

更新:

根据我最初对你问题的理解,你想做的是:

首先,你想获取当前日期的UTC时间(比如在EST的晚上11点,实际上是UTC的22号,因为那时UTC已经是22号了)。

>>> from datetime import datetime
>>> today = datetime.utcnow().date()
>>> today
datetime.date(2013, 2, 21)

其次,你想要那一天的00:00:00作为搜索的开始时间。

>>> from dateutil import tz
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc())

除了你还想知道这个时间在纽约是什么时候:

>>> from dateutil import tz
>>> est = tz.gettz('America/New_York')
>>> start = start.astimezone(est)
>>> start
datetime.datetime(2013, 2, 20, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))

你还想把明天的开始时间作为结束时间:

>>> from datetime import timedelta
>>> end = start + timedelta(1)
>>> end
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))

总结:

today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est)
end = start + timedelta(1)

撰写回答