min*_*ief 277 python timezone datetime date
我试图从值中减去一个日期值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?当然,理想的解决方案是让它自动知道时区.
And*_*Dog 331
在标准库中,没有创建自己的时区类的创建感知时区的跨平台方法.
在Windows上,有win32timezone.utcnow(),但这是pywin32的一部分.我宁愿建议使用pytz库,它有一个不断更新的大多数时区数据库.
使用本地时区可能非常棘手(请参阅下面的"进一步阅读"链接),因此您可能更愿意在整个应用程序中使用UTC,尤其是算术运算,如计算两个时间点之间的差异.
您可以像这样获得当前日期/时间:
import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)
Run Code Online (Sandbox Code Playgroud)
请注意datetime.today()并datetime.now()返回当地时间,而不是UTC时间,因此应用.replace(tzinfo=pytz.utc)它们是不正确的.
另一个好方法是:
datetime.now(pytz.utc)
Run Code Online (Sandbox Code Playgroud)
这有点短,并做同样的事情.
在许多情况下进一步阅读/观看为什么更喜欢UTC:
phi*_*reo 97
获取特定时区的当前时间:
import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))
Run Code Online (Sandbox Code Playgroud)
Fli*_*imm 58
在Python 3中,标准库使得将UTC指定为时区变得更加容易:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2016, 8, 26, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)
如果您想要一个仅使用标准库并且在Python 2和Python 3中都有效的解决方案,请参阅JF Sebastien的答案.
jfs*_*jfs 18
这是一个适用于Python 2和3的stdlib解决方案:
from datetime import datetime
now = datetime.now(utc) # Timezone-aware datetime.utcnow()
today = datetime(now.year, now.month, now.day, tzinfo=utc) # Midnight
Run Code Online (Sandbox Code Playgroud)
其中today是一个表示UTC日期(午夜)开始的知晓日期时间实例,它utc是一个tzinfo对象(来自文档的示例):
from datetime import tzinfo, timedelta
ZERO = timedelta(0)
class UTC(tzinfo):
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Run Code Online (Sandbox Code Playgroud)
相关:对于给定的UTC时间,获得午夜(一天开始)的几种方法的性能比较.
注意:对于具有非固定utc偏移的时区来说,午夜时间更复杂.
Dar*_*zak 14
另一种构造表示当前时间的时区感知日期时间对象的方法:
import datetime
import pytz
pytz.utc.localize( datetime.datetime.utcnow() )
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Django,则可以将日期设置为非tz(仅限utc).
在settings.py中注释以下行:
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
应该强调的是,从 Python 3.6 开始,您只需要标准库即可获取代表本地时间(操作系统设置)的时区感知日期时间对象。使用astimezone()
\nimport datetime\n\ndatetime.datetime(2010, 12, 25, 10, 59).astimezone()\n# e.g.\n# datetime.datetime(2010, 12, 25, 10, 59, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), \'Mitteleurop\xc3\xa4ische Zeit\'))\n\ndatetime.datetime(2010, 12, 25, 12, 59).astimezone().isoformat()\n# e.g.\n# \'2010-12-25T12:59:00+01:00\'\n\n# I\'m on CET/CEST\nRun Code Online (Sandbox Code Playgroud)\n(参见@johnchen902的评论)。
\n但请注意,有一个小警告,不要指望 timedelta 时区有任何“DST 意识”。
\n从Python 3.3开始,仅使用标准库的单行代码就可以使用。您可以datetime使用来获取本地时区感知对象astimezone(如johnchen902所建议):
from datetime import datetime, timezone
aware_local_now = datetime.now(timezone.utc).astimezone()
print(aware_local_now)
2019-08-02 11:26:32.341817-07:00
Run Code Online (Sandbox Code Playgroud)
以下是使用stdlib生成它的一种方法:
import time
from datetime import datetime
FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)
Run Code Online (Sandbox Code Playgroud)
date将存储本地日期和UTC的偏移量,而不是UTC时区的日期,因此如果需要确定生成日期的时区,则可以使用此解决方案.在此示例中和我当地时区:
date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
date.tzname()
'UTC+02:00'
Run Code Online (Sandbox Code Playgroud)
关键是将%z指令添加到表示FORMAT,以指示生成的时间结构的UTC偏移.其他表示格式可以在datetime模块文档中查阅
如果您需要UTC时区的日期,可以将time.localtime()替换为time.gmtime()
date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)
date
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)
date.tzname()
'UTC'
Run Code Online (Sandbox Code Playgroud)
编辑
这仅适用于python3.z指令在python 2 _strptime.py代码上不可用
使用可识别时区的Python datetime.datetime.now()中所述的dateutil :
from dateutil.tz import tzlocal
# Get the current date/time with the timezone.
now = datetime.datetime.now(tzlocal())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
283252 次 |
| 最近记录: |