Python 使用时区获取昨天的日期

Python 使用时区获取昨天的日期,python,Python,嗨,我能找到这个问题的答案,但不包括时区() 这对我来说很好: >>> import time >>> time.strftime('/%Z/%Y/%m/%d') '/EST/2013/01/18' 但是有没有办法得到昨天的约会呢? 当我们从东部标准时间切换到东部标准时间,从东部标准时间切换到东部标准时间时,我需要处理时区的变化 datetime模块允许使用timedelta,但naive对象在默认情况下不支持时区,我不知道如何处理它。对于记帐时区和夏令时更

嗨,我能找到这个问题的答案,但不包括时区()

这对我来说很好:

>>> import time
>>> time.strftime('/%Z/%Y/%m/%d')
'/EST/2013/01/18'
但是有没有办法得到昨天的约会呢? 当我们从东部标准时间切换到东部标准时间,从东部标准时间切换到东部标准时间时,我需要处理时区的变化


datetime模块允许使用timedelta,但naive对象在默认情况下不支持时区,我不知道如何处理它。

对于记帐时区和夏令时更改,datetime.datetime对象需要具有时区意识,即
tzinfo
属性不应为
None
。这可以通过子类化
tzinfo
抽象类来实现。
ustimezone
模块正是这样做的

>>> import ustimezone
>>> from datetime import datetime, tzinfo, timedelta
>>> yesterday = datetime.now() - timedelta(days=1)
>>> yesterday
datetime.datetime(2013, 1, 17, 18, 24, 22, 106445)
>>> yesterday_aware = yesterday.replace(tzinfo=ustimezone.Eastern)
>>> yesterday.strftime('%Z/%Y/%m/%d')
'EST/2013/01/17'    # Will show EDT/EST depending on dst being present or not.
dst信息由时间元组的
tm_isdst
值捕获

>>> yesterday_aware.timetuple()
time.struct_time(tm_year=2013, tm_mon=1, tm_mday=17, tm_hour=18, tm_min=24, tm_sec=22, tm_wday=3, tm_yday=17, tm_isdst=0)
>>> _.tm_isdst
>>> 0    # the tm_isdst flag of the time tuple can be used for checking if DST is present or not.
这里的
ustimezone
模块看起来像这样(借用Python参考中的一个示例)

从datetime导入datetime、tzinfo、timedelta
零=时间增量(0)
小时=时间增量(小时=1)
#全面实施美国主要时区的现行DST规则。
def第一个星期日在星期日或星期日之后(dt):
天数=6-dt.weekday()
如果还有几天:
dt+=时间增量(天数)
返回dt
#美国DST规则
#
#对我们来说,这是一套简化的(即,在某些情况下是错误的)规则
#DST开始和结束时间。获取一套完整且最新的DST规则
#和时区定义,请访问Olson数据库(或尝试pytz):
# http://www.twinsun.com/tz/tz-link.htm
# http://sourceforge.net/projects/pytz/ (可能不是最新的)
#
#在美国,自2007年以来,DST在第二天凌晨2点(标准时间)开始
#3月的星期日,即3月8日当天或之后的第一个星期日。
DSTSTART_2007=日期时间(1,3,8,2)
#并于11月1日第一个星期日凌晨2点(DST时间;标准时间凌晨1点)结束。
DSTEND_2007=日期时间(1,11,1,1)
#从1987年到2006年,DST通常在第一天凌晨2点(标准时间)开始
#4月的星期日,最后一天凌晨2点(DST时间;标准时间凌晨1点)结束
#10月的星期日,即10月25日当天或之后的第一个星期日。
DSTSTART_1987_2006=日期时间(1,4,1,2)
DSTEND_1987_2006=日期时间(1,10,25,1)
#从1967年到1986年,DST通常在最后一天凌晨2点(标准时间)开始
#4月的星期日(4月24日当天或之后的一天),并在凌晨2点结束(美国夏令时时间;
#10月最后一个星期日(即第一个星期日)凌晨1点(标准时间)
#10月25日当天或之后。
DSTSTART_1967_1986=日期时间(1,4,24,2)
DSTEND_1967_1986=DSTEND_1987_2006
乌司米酮类(tzinfo):
定义初始化(self、hours、reprname、stdname、dstname):
self.stdoffset=timedelta(小时=hours)
self.reprname=reprname
self.stdname=stdname
self.dstname=dstname
定义报告(自我):
return self.reprname
def tzname(自身,dt):
如果自测试(dt):
返回self.dstname
其他:
return self.stdname
def utcoffset(自身,dt):
返回self.stdoffset+self.dst(dt)
def dst(自身,dt):
如果dt为无或dt.tzinfo为无:
#在一种或两种情况下,例外情况可能是合理的。
#这取决于你想如何对待他们。默认值
#fromutc()实现(默认情况下使用astimezone()调用)
#实现)通过dt.tzinfo is self传递日期时间。
归零
断言dt.tzinfo是self
#查找美国DST的开始和结束时间。在1967年之前的几年里,回归
#零表示无DST。
如果2006年如果记帐时区和夏令时的start发生更改,
datetime.datetime
对象需要具有时区意识,即
tzinfo
属性不应为
None
。这可以通过子类化
tzinfo
抽象类来实现。
ustimezone
模块正是这样做的

>>> import ustimezone
>>> from datetime import datetime, tzinfo, timedelta
>>> yesterday = datetime.now() - timedelta(days=1)
>>> yesterday
datetime.datetime(2013, 1, 17, 18, 24, 22, 106445)
>>> yesterday_aware = yesterday.replace(tzinfo=ustimezone.Eastern)
>>> yesterday.strftime('%Z/%Y/%m/%d')
'EST/2013/01/17'    # Will show EDT/EST depending on dst being present or not.
dst信息由时间元组的
tm_isdst
值捕获

>>> yesterday_aware.timetuple()
time.struct_time(tm_year=2013, tm_mon=1, tm_mday=17, tm_hour=18, tm_min=24, tm_sec=22, tm_wday=3, tm_yday=17, tm_isdst=0)
>>> _.tm_isdst
>>> 0    # the tm_isdst flag of the time tuple can be used for checking if DST is present or not.
这里的
ustimezone
模块看起来像这样(借用Python参考中的一个示例)

从datetime导入datetime、tzinfo、timedelta
零=时间增量(0)
小时=时间增量(小时=1)
#全面实施美国主要时区的现行DST规则。
def第一个星期日在星期日或星期日之后(dt):
天数=6-dt.weekday()
如果还有几天:
dt+=时间增量(天数)
返回dt
#美国DST规则
#
#对我们来说,这是一套简化的(即,在某些情况下是错误的)规则
#DST开始和结束时间。获取一套完整且最新的DST规则
#和时区定义,请访问Olson数据库(或尝试pytz):
# http://www.twinsun.com/tz/tz-link.htm
# http://sourceforge.net/projects/pytz/ (可能不是最新的)
#
#在美国,自2007年以来,DST在第二天凌晨2点(标准时间)开始
#3月的星期日,即3月8日当天或之后的第一个星期日。
DSTSTART_2007=日期时间(1,3,8,2)
#并于11月1日第一个星期日凌晨2点(DST时间;标准时间凌晨1点)结束。
DSTEND_2007=日期时间(1,11,1,1)
#从1987年到2006年,DST通常在第一天凌晨2点(标准时间)开始
#4月的星期日,最后一天凌晨2点(DST时间;标准时间凌晨1点)结束
#10月的星期日,即10月25日当天或之后的第一个星期日。
DSTSTART_1987_2006=日期时间(1,4,1,2)
DSTEND_1987_2006=日期时间(1,10,25,1)
#从1967年到1986年,DST通常在最后一天凌晨2点(标准时间)开始