确定当天的开始和结束时间(UTC - > EST - > UTC); 蟒蛇

mr-*_*-sk 19 python timezone datetime

我将所有时间都存储在UTC中,我的系统设置为UTC(虽然我在EST).

我将日期存储为:

Wed, 20 Feb 2013 03:51:39 +0000
Run Code Online (Sandbox Code Playgroud)

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

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

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
    2013-02-19 23:17:20.560898-05:00
    
    Run Code Online (Sandbox Code Playgroud)
  • 接下来我想知道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")
Run Code Online (Sandbox Code Playgroud)

这会给我

02 20 2013
02 21 2013
Run Code Online (Sandbox Code Playgroud)

哪个是对的.我现在需要从中生成完整的EST时间,然后转换为UTC.这我无法弄明白.实际上,我可能希望在完成时转换为UTC纪元时间戳,因为这将使我的数据库操作非常简单(<,>,==等).

Len*_*bro 30

将当前时间作为UTC并将其转换为EST的第一步似乎有点无意义.你用那个时间做什么吗?

除此之外,它似乎相当直接.您希望以UTC格式获得一天EST的开始和结束,因此您可以创建它们并将它们转换为UTC.那不是那么复杂.:-)

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

更新:

从我对你的问题的原始理解,这是你想要做的:

首先,你想得到当前日期,因为它是UTC(所以在美国东部时间晚上11点,第12个,你想要第22个,因为它是UTC的第22个.

>>> from datetime import datetime
>>> today = datetime.utcnow().date()
>>> today
datetime.date(2013, 2, 21)
Run Code Online (Sandbox Code Playgroud)

其次,您希望当天的00:00:00为UTC,作为搜索的开始.

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

除了你想知道纽约的那个时间:

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

你也希望明天作为结束:

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

摘要:

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


myu*_*uf3 6

我肯定会给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)
Run Code Online (Sandbox Code Playgroud)

获得在Delorean对象中解析的日期时间后,只需转换为EST即可

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

虽然没有意义.你永远不会在你的问题中使用它,但是使用Delorean非常容易.

然后你现在在美国东部时间得到时间

来自delorean进口Delorean

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

现在进行截断步骤.

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

按照上面的简单转换到UTC.

现在结束一天.

d = d.next_day(1) # move to the next day
Run Code Online (Sandbox Code Playgroud)

然后转回一秒钟.图书馆需要的东西我会更新这个.只需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>)
Run Code Online (Sandbox Code Playgroud)

Goodluck,但这个库应该只是你处理datetime操作:)


小智 6

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

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

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
Run Code Online (Sandbox Code Playgroud)


Lif*_*hen 5

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


jua*_*ith 5

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

import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
Run Code Online (Sandbox Code Playgroud)