Python使日期时间偏移感知

时间:2018-06-04 02:35:00

标签: python datetime time offset

我想获取datetime的偏移量并创建一个有意识的字符串。

以下IDLE代码有效:

Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux

import datetime
date_now = datetime.datetime.now()
date_now_with_offset = date_now.astimezone()
print(date_now_with_offset)
2018-06-03 17:48:50.258504-05:00

脚本中的以下代码会出错:

import datetime
date_now = datetime.datetime.now()
date_now_with_offset = date_now.astimezone()
print(date_now_with_offset)

TypeError: Required argument 'tz' (pos 1) not found

我意识到偏移和时区是不同的,但在任何特定时刻 即使时区偏移可能在一年内波动,本地时间也应该与准确的时区偏移相同。

发生了什么以及为什么?什么是最好的解决方案?

4 个答案:

答案 0 :(得分:1)

该脚本由python2解释器执行。在脚本中添加一个显式的python3 shebang:

#! /usr/bin/env python3

import datetime
....

答案 1 :(得分:1)

来自你的追溯:TypeError: Required argument 'tz' (pos 1) not found。您的脚本使用的是Python2,它通常与Python3不兼容。在Python2中,您必须提供时区。请参阅Python2Python3文档之间的区别。

在Linux中,python字专门表示python2。除非使用别名,否则使用python3键入Python3。要解决此问题,请将所有python更改为python3,如

#! /usr/bin/env python3
python3 offset.py

注意: 从Python3文档中,它不适用于所有版本的Python3:

  

版本3.3中已更改:tz现在可以省略。

     

版本3.6中更改:现在可以在假定代表系统本地时间的幼稚实例上调用astimezone()方法。

答案 2 :(得分:1)

如果datetime对象缺少时区,则可以添加:

from datetime import datetime, timezone

datetime(1970,1,1).replace(tzinfo=timezone.utc)

或在构造日期时间对象时

datetime(1970,1,1).tzinfo==None                                                                                                                              
# Out: True
datetime(1970,1,1, tzinfo=timezone.utc).tzinfo                                                                                                               
# Out: datetime.timezone.utc

timezone从版本3.2起可用

在尝试计算时间差时,我在Python 3中遇到了类似的错误

d = "Tue 01 May 2018 10:34:15 -0000" # date string with timezone
dt = datetime.strptime(d, "%a %d %b %Y %H:%M:%S %z")                                                                                                         
dt                                                                                                                                                           
# datetime.datetime(2018, 5, 1, 10, 34, 15, tzinfo=datetime.timezone.utc)
dt - datetime(1970,1,1)
# TypeError: can't subtract offset-naive and offset-aware datetimes

解决方案:创建日期时间时添加时区或修改现有的日期时间对象

dt.tzinfo    
# datetime.timezone.utc
dt - datetime(1970,1,1, tzinfo=timezone.utc)                                                                                                                    
# datetime.timedelta(days=17652, seconds=38055)

# or modify already existing datetime 
d_aware = datetime(1970,1,1).replace(tzinfo=timezone.utc)
dt - d_aware
datetime.timedelta(days=17652, seconds=38055)

根据需要/根据对丢失的时区的了解来定义日期中的时区。

仅需注意:datetime(1970,1,1, tzinfo=timezone.utc)Epoch time (or POSIX/Unix time),并且根据定义具有UTC时区。

答案 3 :(得分:0)

概述:您可以将本地时间转换为另一个时区,并使用astimezone显示新时间。 astimezone会将本地时间转换为时区datetime。 timezone.utc的时区偏移量为0。 astimezone更改时钟和utc偏移量。 astimezone移动小时和天以匹配时区。

from datetime import datetime, timedelta, timezone
print("Eastern Standard Time Zone")
ET=timezone(timedelta(hours=-5))
dt=datetime(2017,12,30,15,9,3)
print(dt.astimezone(ET))
print("India Standard Time Zone")
IST= timezone(timedelta(hours=5,minutes=30))
dt=datetime(2017,12,30,15,9,3)
print(dt.astimezone(IST))