关于深度学习:pytz格式化北京时间多出6分钟问题的解决方法

9次阅读

共计 1579 个字符,预计需要花费 4 分钟才能阅读完成。

起步

在 django 框架中,用的是 pytz 库解决时区问题,所以我也尝试用这个库来解决。但发现了一个奇怪的问题:

1

2

3

4

import datetime

import pytz

<p>dt = datetime.datetime(`2019,6,20,` `12, tzinfo=pytz.timezone('Asia/Shanghai'))<br data-filtered=“filtered”`>

print`(dt) # 2019-06-20 12:00:00+08:06</p>`

为什么多出了 6 分钟来?

起因

这是因为 pytz 里保留是本地工夫。

1

2

3

fmt = '%Y-%m-%d %H:%M:%S %Z%z'

dt = datetime.datetime(`2019,6,20,` `12, tzinfo=pytz.timezone('Asia/Shanghai'))`

print`(dt.strftime(fmt)) # 2019-06-20 12:00:00 LMT+0806`

LMT 即 Local Mean Time 本地工夫,也就是说 ‘Asia/Shanghai’ 这个地区比 utc 多了 8 小时零 6 分钟,并不是北京工夫。

解决

所以 pytz 提供了 normalize() 办法来纠正这个问题,但传入的得是不带时区的日期对象:

1

2

3

4

5

6

7

cn_zone = pytz.timezone(`’Asia/Shanghai’`)

dt = cn_zone.localize(dt = datetime.datetime(`2019,6,20,` `12))`

print`(dt) # 2019-06-20 12:00:00+08:00`

print`(dt.strftime(fmt)) # 2019-06-20 12:00:00 CST+0800`

<h1 id`="或者"> 或者 </h1>`

<p>dt = datetime.datetime(`2019,6,20,` `12)<br data-filtered=“filtered”`>

print`(dt.astimezone(cn_zone)) # 2019-06-20 12:00:00 CST+0800</p>`

这里举荐的还是用 astimezone 的形式,django 也是采纳这种解决形式。

时区转换

以从北京工夫转纽约工夫为例,已知后果它们之间应该相差 12 小时。

1

2

3

dt = datetime.datetime(`2019,6,20,` `12)`

<p>`print(dt.astimezone(tz=`cn_zone)) # 2019-06-20 12:00:00+08:00<br data-filtered="filtered">

print`(dt.astimezone(tz=cn_zone).astimezone(ny_zone)) # 2019-06-20 12:00:00-04:56</p>`

额定

另一个解决时区问题就是应用规范库的 dateutil 工具。官网内置,值得信赖。它反对在创立日期对象的时候进行设置,更为不便:

1

2

3

4

5

6

cn = tz.gettz(`’Asia/Shanghai’`)

<p>aware_dt = datetime.datetime(`2019,6,20,` `12, tzinfo=cn)<br data-filtered=“filtered”`>

print`(aware_dt) # 2019-06-20 12:00:00+08:00</p>`

<h1 id`="时区转换从北京工夫转到纽约工夫"> 时区转换 (从北京工夫转到纽约工夫)</h1>`

<p>ny = tz.gettz(`’America/New_York’)<br datafiltered="filtered">`

print`(aware_dt.astimezone(tz=ny)) # 2019-06-20 00:00:00-04:00</p>`

我更喜爱这种形式。

正文完
 0