我试图从值中减去一个日期值datetime.today()
来计算多久以前的东西.但它抱怨说:
TypeError: can't subtract offset-naive and offset-aware datetimes
Run Code Online (Sandbox Code Playgroud)
该值datetime.today()
似乎不是"时区感知",而我的其他日期值是.如何获得值datetime.today()
是时区的?现在它给我时间在当地时间,恰好是PST,即UTC-8hrs.最坏的情况是,有没有办法我可以手动输入时区值到datetime
返回的对象datetime.today()
并将其设置为UTC-8?当然,理想的解决方案是让它自动知道时区.
有没有办法通过指定日期来获取UTC时间戳?我期待的是:
datetime(2008, 1, 1, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
应该导致
1199145600
Run Code Online (Sandbox Code Playgroud)
创建天真的日期时间对象意味着没有时区信息.如果我查看datetime.utcfromtimestamp的文档,则创建UTC时间戳意味着省略时区信息.所以我猜,创建一个天真的日期时间对象(就像我做的那样)会产生一个UTC时间戳.然而:
then = datetime(2008, 1, 1, 0, 0, 0, 0)
datetime.utcfromtimestamp(float(then.strftime('%s')))
Run Code Online (Sandbox Code Playgroud)
结果是
2007-12-31 23:00:00
Run Code Online (Sandbox Code Playgroud)
datetime对象中是否还有隐藏的时区信息?我究竟做错了什么?
我想存储具有本地化UTC时区的日期时间对象.存储datetime对象的方法可以被赋予非本地化的日期时间(天真)对象或已经本地化的对象.如何确定是否需要本地化?
如果条件丢失的代码:
class MyClass:
def set_date(self, d):
# what do i check here?
# if(d.tzinfo):
self.date = d.astimezone(pytz.utc)
# else:
self.date = pytz.utc.localize(d)
Run Code Online (Sandbox Code Playgroud) 我在pytz的.localize()函数中遇到了一些奇怪的问题.有时它不会调整本地化的日期时间:
.localize行为:
>>> tz
<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>
>>> d
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421)
>>> tz.localize(d)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
>>> tz.normalize(tz.localize(d))
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)
如您所见,由于本地化/规范化操作,时间没有改变.但是,如果使用.replace:
>>> d.replace(tzinfo=tz)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>)
>>> tz.normalize(d.replace(tzinfo=tz))
datetime.datetime(2009, 9, 2, 15, 1, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)
这似乎调整了日期时间.
问题是 - 这是正确的,为什么其他的错?
由于某些我无法弄清楚的原因,从以下代码:
>>> from pytz import timezone
>>> timezone('America/Chicago')
Run Code Online (Sandbox Code Playgroud)
我明白了:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>
Run Code Online (Sandbox Code Playgroud)
我想,我应该得到:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:00:00 STD>
Run Code Online (Sandbox Code Playgroud)
...因为我认为我的时区距离UTC只有6小时9分钟.
我已经查看了源代码,pytz
但我承认我还没有完全弄清楚出了什么问题.
我已将其他值传递给timezone()
函数,它返回的值似乎是正确的.但由于某些原因,与我的时区相关的信息不正确.
最后,我旁边的立方体中的同事确认该函数在他的机器上返回正确的时区信息.
有谁知道为什么我的时区('America/Chicago'
)会在9分钟后关闭?我运行版本2015.7
的pytz
安装使用pip
.谢谢!
当我这样做时,这total_seconds()
是不正确的:
from datetime import timedelta, datetime
from pytz import timezone
timezone = timezone('Australia/Sydney')
startDate = datetime.now(timezone)
dateStr = '2020-05-18 20:12:30' # In our brain we know this time is in Sydney Time
endDate = datetime.strptime(dateStr, '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone)
diff = endDate - startDate
print(diff.total_seconds()) # incorrect answer
Run Code Online (Sandbox Code Playgroud)
当两个日期时间对象最初都是日期时间对象时,将它们相减,它们是正确的
from datetime import timedelta, datetime
from pytz import timezone
timezone = timezone('Australia/Sydney')
startDate = datetime.now(timezone)
endDate = datetime.now(timezone) + timedelta(hours=2, seconds=32)
diff = endDate - startDate
print(diff.total_seconds()) # correct answer
Run Code Online (Sandbox Code Playgroud)
我该如何解决我的问题?