37

我将所有时间都存储在 UTC 中,并且我的系统设置为 UTC(尽管我在 EST)。

我将日期存储为:

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

但是,我想根据今天的 EST 选择信息,所以我试图:

  • 获取当前时间为 UTC 并更改为 EST

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

  • 一旦我有了这些值,我想转换回 UTC,所以我有一个高低值,我可以通过正确的 EST(我的时区)来钳制它。

如果这不是最好的方法,或者我遗漏了一些东西(对我来说似乎过于复杂),请帮助我看到光明!

TIA

每个答案更新:

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

哪个是对的。我现在需要从中生成完整的 EST 时间,然后转换为 UTC。这个我想不通。实际上,我可能想在完成时转换为 UTC 纪元时间戳,因为这将使我的数据库操作非常容易(<、>、== 等)。

4

10 回答 10

53

获取当前时间为 UTC 并将其转换为 EST 的第一步似乎有点毫无意义。你把这段时间用在什么事情上吗?

除此之外,它似乎相当直截了当。您想以 UTC 获取一天 EST 的开始和结束,因此您创建它们并将它们转换为 UTC。那没那么复杂。:-)

你可能想看看你的匹配例程,这样你就可以使用今天的开始作为较低的值,明天的开始作为较高的值,所以你不必处理那个 23:59:59.9999 时间.

更新:

根据我对您问题的最初理解,这就是您想要做的:

首先,您想要获取 UTC 中的当前日期(因此,在 12 日东部标准时间晚上 11 点,您想要 22 日,因为它是 UTC 中的 22 日。

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

其次,您希望 UTC 当天的 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)
于 2013-02-20T05:26:29.657 回答
21

使用datetime pytz将解决您的问题。

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
于 2018-10-16T07:49:47.890 回答
8

我肯定会给Delorean看看,解决您的问题将遵循几个步骤。

您首先需要解析您的字符串。出色地使用 Delorean解析方法。

>>> from delorean import parse
>>> d = parse("Wed, 20 Feb 2013 03:51:39 +0000")
>>> d
Delorean(datetime=2013-02-20 03:51:39+00:00, timezone=UTC)

一旦有了在 Delorean 对象中解析的日期时间,您只需将其转换为 EST

>>> d = d.shift('US/Eastern')
>>> d
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern)

尽管毫无意义。你永远不会在你的问题中使用它,但使用 Delorean 非常容易。

然后你现在在 EST 得到时间

从德洛伦进口德洛伦

>>> d1 = Delorean(timezone="US/Eastern")
>>> d1
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern)

现在进行截断步骤。

>>> d.truncate('day')
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern)

将上述简单转换为 UTC。

现在结束一天。

d = d.next_day(1) # move to the next day

然后向后移动一秒钟。图书馆需要的东西我会更新这个。只需通过使用属性来获取Delorean示例中的日期时间。datetime

d.datetime - timedelta(seconds=1)
datetime.datetime(2013, 2, 21, 23, 59, 59, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)

祝你好运,但这个库应该只是你处理日期时间操作:)

于 2013-02-21T05:47:04.107 回答
7

这只是部分答案,因为其余部分已经很好地涵盖了。我为此苦苦挣扎了一段时间,因为某些技术具有包容性搜索,而且我不想包含第二天第一微秒的任何数据。

我快速正确地找到一天结束时间的解决方案是:

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
于 2018-07-28T19:45:48.420 回答
7

这个问题很老,但也许这有帮助:

import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
于 2019-04-08T09:49:20.977 回答
2

刚刚遇到这个,这是我找到的最简单的选项:

from delorean import Delorean
today_d = Delorean()
sod_dt = today_d.start_of_day
eod_dt = today_d.end_of_day
sod_d = Delorean(sod_dt)
eod_d = Delorean(eod_dt)
sod_e = sod_d.epoch
eod_e = eod_d.epoch

确认:

In [69]: eod_e - sod_e
Out[69]: 86399.99999904633

对大多数人来说足够接近

于 2017-03-30T18:49:31.197 回答
1

如果您已经使用Arrow ,这是一个很好的解决方案

import arrow

now = arrow.now('US/Eastern')
start = now.floor('day')
end = now.ceil('day')

# Use the "datetime" property to access the actual datetime
print(start.datetime)
于 2020-09-15T21:48:32.353 回答
0

开始一天的最简单解决方案,尽管在不幸的浮点不精确情况下它可能会产生幻微秒:

import datetime as dt
d = dt.datetime.now()
d = d - dt.timedelta(seconds=d.timestamp() % dt.timedelta(days=1).total_seconds())
于 2020-06-30T10:37:33.560 回答
0

类似于检查和第一篇文章,但如果你想今天而不是昨天使用本地时区而不是硬编码,请执行以下操作:

today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day).astimezone()
end = start + timedelta(1)
于 2021-01-06T18:57:41.387 回答
0

这个怎么样

import datetime
datetime.datetime.combine(datetime.date.today(), datetime.time(00, 00, 00))
datetime.datetime.combine(datetime.date.today(), datetime.time(23, 59, 59))
于 2020-12-22T02:15:01.647 回答