我将所有时间都存储在UTC中,我的系统设置为UTC(虽然我在美国东部时间)。
我将日期存储为:
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纪元时间戳,因为这将使我的数据库操作非常简单(<,>,==等)。
答案 0 :(得分:27)
将当前时间作为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)
其次,您希望当天的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())
除了你想知道纽约的那个时间:
>>> 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)
答案 1 :(得分:6)
我肯定会给Delorean看看,解决你的问题会有几个步骤。
首先需要解析你的字符串。很好地使用Delorean parse方法。
>>> 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)
现在进行truncation步骤。
>>> 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>)
Goodluck,但这个库应该只是你处理日期时间操作:)
答案 2 :(得分:2)
这只是部分答案,因为其余的内容已经很好地涵盖了。由于某些技术具有包容性搜索,我为此做了一段时间,而我不想包含第二天第一毫秒的任何数据。
我为快速正确地找到一天结束时间的解决方案是:
reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
答案 3 :(得分:2)
使用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
答案 4 :(得分:1)
刚碰到这个,这是我发现的最简单的选项:
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
足够接近大多数人
答案 5 :(得分:0)
这个问题很老,但是也许有帮助:
import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
答案 6 :(得分:0)
最简单的解决方案,尽管它在不幸的浮点不精确情况下可能会产生幻像微秒:
import datetime as dt
d = dt.datetime.now()
d = d - dt.timedelta(seconds=d.timestamp() % dt.timedelta(days=1).total_seconds())
答案 7 :(得分:0)
如果您已经使用nice solution,则为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)
答案 8 :(得分: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))
答案 9 :(得分:0)
类似于checked & first post,但如果你想把今天和昨天一样使用本地时区而不是硬编码,请执行:
today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day).astimezone()
end = start + timedelta(1)