将utc时区中的时间戳转换为给定的时区



python version: 3.7

我正在尝试将utc时间戳转换为使用pytzastimezone的给定时区。

(我有时间戳存储在我的数据库在utc时区,我试图转换它们)

例如:

  • 将'2022-07-18 19:43:26.164345'时间戳转换为'US/Pacific'时区将得到'2022-07-18 12:43:26.164345-07:00'
  • 将'2022-07-18 19:43:26.164345'时间戳转换为'UTC'时区将影响任何更改-将导致'2022-07-18 19:43:26.164345'

这是我尝试的:

import pytz
def convert_utc_timestamp_to_timezone(utc_timestamp, dt_timezone):
return utc_timestamp.astimezone(pytz.timezone(dt_timezone))

预期:

> dt = datetime.datetime.now()
> convert_utc_timestamp_to_timezone(dt, 'UTC') // expected result: dt

但没有. .,实际结果::

> dt = datetime.datetime.now()
> converted = convert_utc_timestamp_to_timezone(dt, 'UTC')
> print(dt) # 2022-07-18 23:10:34.061169
> print(converted) # 2022-07-18 20:10:34.061169+00:00
# dt != converted not as I expect

当我的本地时区设置为utc时-例如在在线浏览器上运行时

import datetime
import pytz

def convert_utc_timestamp_to_timezone(utc_timestamp, dt_timezone):
return utc_timestamp.astimezone(pytz.timezone(dt_timezone))

dt = datetime.datetime.utcnow()
a = convert_utc_timestamp_to_timezone(dt, 'US/Pacific')
print('in utc timezone',dt)
print('after convert to US/Pacific timezone: ',a)

# results:
#in utc timezone 2022-07-18 20:18:37.253062
# after convert to US/Pacific timezone:  2022-07-18 13:18:37.253062-07:00
dt2 = datetime.datetime.utcnow()
a2 = convert_utc_timestamp_to_timezone(dt, 'UTC')
print('in utc timezone', dt2)
print('after convert to UTC timezone: ',a2)
# results:
# in utc timezone 2022-07-18 20:18:37.264363
# after convert to UTC timezone:  2022-07-18 20:18:37.253062+00:00

但是在本地运行时不能很好地工作-因为我的pc时区不是utc
(文档实际上声明astimezone"转换为本地时间")

import pytz
def convert_utc_timestamp_to_timezone(utc_timestamp, dt_timezone):
return utc_timestamp.astimezone(pytz.timezone(dt_timezone))
dt = datetime.datetime.utcnow()
a = convert_utc_timestamp_to_timezone(dt, 'US/Pacific')
print('in utc timezone', dt)
print('after convert to US/Pacific timezone: ', a)
# result:
# in utc timezone 2022-07-18 20:22:05.526588
# after convert to US/Pacific timezone:  2022-07-18 10:22:05.526588-07:00
dt2 = datetime.datetime.utcnow()
a2 = convert_utc_timestamp_to_timezone(dt, 'UTC')
print('in utc timezone', dt2)
print('after convert to UTC timezone: ', a2)
# result:
# in utc timezone 2022-07-18 20:22:05.576213
# after convert to UTC timezone:  2022-07-18 17:22:05.526588+00:00

将utc时区中的时间戳转换为给定时区的正确方法是什么?
我尝试了pytzlocalize,但也没有给出预期的结果

这与Python日期时间类型的一个常见问题有关,有点是由于遗留代码的原因。简短的回答是,您混合了时区感知和时区非感知类型。

下面是获取utc时间戳的正确方法:
In [85]: bad_utc = dt.datetime.utcnow()  # no timezone info
...: (bad_utc, bad_utc.astimezone(pytz.utc))
...:
Out[85]:
(
datetime.datetime(2022, 7, 18, 20, 23, 44, 583377),
datetime.datetime(2022, 7, 19, 3, 23, 44, 583377, tzinfo=<UTC>),
)
In [86]: good_utc = dt.datetime.now(datetime.timezone.utc)  # has timezone info
...: (good_utc, good_utc.astimezone(pytz.utc))
...:
Out[86]:
(
datetime.datetime(2022, 7, 18, 20, 23, 47, 323579, tzinfo=datetime.timezone.utc),
datetime.datetime(2022, 7, 18, 20, 23, 47, 323579, tzinfo=<UTC>),
)
由于这个原因,有像pendulum这样的库"做正确的事情"。并避免这些陷阱,例如:
In [79]: dt.datetime.utcnow()  # wrong
Out[79]: datetime.datetime(2022, 7, 18, 20, 20, 41, 681750)
In [80]: dt.datetime.now(datetime.timezone.utc)  # right
Out[80]: datetime.datetime(2022, 7, 18, 20, 20, 45, 947941, tzinfo=datetime.timezone.utc)
In [81]: pendulum.now().utcnow()  # without gotchas
Out[81]: DateTime(2022, 7, 18, 20, 20, 48, 501773, tzinfo=Timezone('UTC'))

获取一个支持时区的datetime。下面是一个例子:

>>> from datetime import datetime
>>> datetime.now()  # timezone unaware, shows my local time
datetime.datetime(2022, 7, 18, 13, 16, 50, 249012)
>>> from datetime import timezone
>>> datetime.now(tz=timezone.utc)  # timezone aware, UTC
datetime.datetime(2022, 7, 18, 20, 17, 28, 760889, tzinfo=datetime.timezone.utc)

从UTC转换到特定时区:

>>> import pytz
>>> now = datetime.now(tz=timezone.utc)
>>> now.astimezone(tz=pytz.timezone('US/Pacific'))
datetime.datetime(2022, 7, 18, 13, 18, 6, 929968, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

最新更新