代码review 的时候,发现时区处理上有个问题。
为确认下,到研发项目中看了下实际数据,时间上果然有误差。

时区转换的代码类似如下:

import datetime
import pytz
# 将时间戳转成日期对象
now_timestamp = int(time.time())
now_time = datetime.datetime.fromtimestamp(now_timestamp)
# 转成中国上海时区
bangkok_time = now_time.replace(tzinfo=pytz.timezone('Asia/Kolkata')).astimezone(pytz.timezone('Asia/Shanghai'))

注:

此方法转换,时间会有误差,和实际中国区时间相差几分钟甚至几十分钟

Right Style

import datetime
import pytz
now_timestamp = int(time.time())
obj_datetime = datetime.datetime.fromtimestamp(now_timestamp, pytz.timezone('Asia/Shanghai'))
>>> obj_datetime
datetime.datetime(2021, 5, 26, 15, 9, 38, tzinfo=)

Django中使用

- USE_TZ

一个布尔值,用于指定 Django 是否默认使用时区感知。

  • 默认:False
  • 如果设置为 True,Django 将在内部使用时区感知的日期。
  • 当 USE_TZ 为 False 时,Django 将使用本地时间的本地日期,
- TIME_ZONE

默认: 'America/Chicago'

这不一定是服务器的时区。例如,一个服务器可能服务于多个 Django 网站,每个网站都有单独的时区配置。

setting 配置:

USE_TZ = False
TIME_ZONE = ‘Asia/Kolkata’

测试:

$ python manage.py shell
>>> import datetime
>>> import time
>>> import pytz
>>> datetime.datetime.now()  # 当前时间,时区 Asia/Kolkata
datetime.datetime(2021, 5, 26, 12, 39, 38, 428394)
>>> timestamp = int(time.time())
>>> datetime.datetime.fromtimestamp(timestamp)
datetime.datetime(2021, 5, 26, 12, 39, 38)
>>> obj_datetime = datetime.datetime.fromtimestamp(x, pytz.timezone('Asia/Shanghai'))   # 转为中国上海时区
>>> obj_datetime
datetime.datetime(2021, 5, 26, 15, 9, 38, tzinfo=)
>>> obj_datetime.strftime('%Y-%m-%d')  # 格式化为字符串
'2021-05-26'
>>> obj_datetime.strftime('%Y%m%d')
'20210526'
>>> xx.strftime('%H:%M')  # 时间字符串,Kolkata时间 12:39, 相差2个半小时
'15:09'