我想获取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
我意识到偏移和时区是不同的,但在任何特定时刻
即使时区偏移可能在一年内波动,本地时间也应该与准确的时区偏移相同。
发生了什么以及为什么?什么是最好的解决方案?
答案 0 :(得分:1)
该脚本由python2解释器执行。在脚本中添加一个显式的python3 shebang:
#! /usr/bin/env python3
import datetime
....
答案 1 :(得分:1)
来自你的追溯:TypeError: Required argument 'tz' (pos 1) not found
。您的脚本使用的是Python2,它通常与Python3不兼容。在Python2中,您必须提供时区。请参阅Python2和Python3文档之间的区别。
在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))