Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次 Python 项目全量替换至 UTC 时区的重构经历(上)

记一次 Python 项目全量替换至 UTC 时区的重构经历(上)

原创
作者头像
远哥制造
修改于 2023-11-29 10:46:53
修改于 2023-11-29 10:46:53
49500
代码可运行
举报
文章被收录于专栏:远哥制造远哥制造
运行总次数:0
代码可运行

0x00.TL;DR

  • time.mktime() -> import calendar calendar.timegm()
  • time.localtime() -> time.gmtime()
  • datetime.datetime.now() -> datetime.datetime.utcnow()

0x01.前言

目前测试环境中 VM 的时区全是 Asia/Shanghai(即 CST:GMT+8),但是可能会部署至非 CST 时区的地域,前端显示会有问题

经上层决策后决定将项目中的时区全部改成 UTC(即 GMT+0),前后端统一都用 UTC。于是撸起袖子开干

0x02.生成时间的格式汇总

代码中主要有 3 种

  • 1. 时间戳类型,比如官方 time 库中 time.time() 的输出
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> time.time()
1701171876.286261
  • 2. 时间对象类型,比如官方 time 库和 datetime 库中的时间对象
  • 3. 时间字符串类型,比如官方 time 库中 time.strftime() 的输出
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
'2023-11-28 19:44:36'

以上两种格式都需要统一至 UTC,上述只举例了 time 库,但实际项目中还用到了官方 datetime 库,需要仔细搜索

0x03.重构时间戳类型

1. time.time(),阅读文档可知已经是 UTC 的时间戳,无需转换

参照上文中的输出,UTC 时间是 11:44:36,木有问题

2. time.mktime() -> calendar.timegm()

2.1 举个栗子 1,如下 start_time 的取法可以直接使用 time.time() 替换

原来的方法是先创建 datetime 对象,然后转换至 UTC 的时间戳,太麻烦了重构掉

2.2 举个栗子 2,如下 start_time 的取法就需要使用 calendar.timegm() 替换

因 time.mktime() 是 local_time 的反函数,也就是传入的 struct_time 经过转换会变成 localtime 对应的时间戳,需要修改

阅读文档可知可以用 import calendar calendar.timegm(),它返回的是 UTC 对应的时间戳

0x04.重构时间对象类型

1. time.localtime() -> time.gmtime()

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> time.localtime()
time.struct_time(tm_year=2023, tm_mon=11, tm_mday=28, tm_hour=19, tm_min=44, tm_sec=36, tm_wday=1, tm_yday=332, tm_isdst=0)

本地时间的 struct_time,需要切换至 UTC 时间的 struct_time

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> time.gmtime()
time.struct_time(tm_year=2023, tm_mon=11, tm_mday=28, tm_hour=11, tm_min=44, tm_sec=36, tm_wday=1, tm_yday=332, tm_isdst=0)

阅读文档可知可以用 time.gmtime()

2. datetime.datetime.now() -> datetime.datetime.utcnow()

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> datetime.datetime.now()
datetime.datetime(2023, 11, 28, 20, 34, 3, 121237)

本地时间的 datetime 对象,需要切换至 UTC 时间的 datetime 对象

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> datetime.datetime.utcnow()
datetime.datetime(2023, 11, 28, 12, 34, 3, 121237)

阅读文档可知用 datetime.utcnow()

0x05.重构时间字符串类型

1. time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

将其中的 time.localtime() 替换至 time.gmtime() 是最简便的方法

也就是 time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())

2. datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

本着能用 time 库就不用 datetime 库的原则,替换至 time 库

同样替换装 time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())

3. 关于 datetime 库的使用,有的仓库是 import datetime,而有的则是 from datetime import datetime,针对后者 datetime.now().strftime('%Y-%m-%d %H:%M:%S')

同样替换至 time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())

0x06.后记

实际替换时,按照关键字搜索即可

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

DAY 1/3

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python时间处理
Python时间处理 # _*_ coding: utf-8 _*_ import time import calendar import datetime # time模块中的三种时间形式 print("time stamp:", time.time())               # 时间戳 print("local time:", time.localtime())          # struct_time类型的本地时间 print("utc time:", time.gmtime()) 
py3study
2020/01/14
7020
六、python学习笔记-模块-time模块
# time模块 """ 1、时间相关的功能模块 """ # 引入模块 import time import datetime # 打印帮助文档 print(help(time)) # 时间戳,返回当前时间的时间戳(1970纪元后经过的浮点秒数) print(time.time()) # 以科学计数法表示cpu运算时间 print(time.clock()) # 结构化时间,打印格林威治时间(UTC),返回time.struct_time类型的对象(元组格式),(struct_time是在time
堕落飞鸟
2022/01/13
3640
python的datetime库
python doc里面有段这样的描述,将日期时间分为两种类型“aware”和“naive”。navie不携带timezone时区信息,所以navie的时间格式在理解上会有歧义。
mariolu
2024/01/21
2400
Python time模块详解(时间戳↔元组形式↔格式化形式三者转化)计算时间差
在Python中, time有三种表示形式 1 时间戳:1970年1月1日之后的秒 2 元组格式化形式 包含了:年、日、星期 得到time.struct_time( tm_year=2017, tm_mon=10, tm_mday=14…) print(‘2.元组格式化形式:{}’.format(time.gmtime())) 3 可视化的字符串 2017-11-11 11:44
学到老
2019/02/14
2.8K0
python时间模块time和datet
通用时间格式:     1.时间戳(timestamp) import time   time.time()  1970年-目前     2.格式化的时间字符串     3.元组(struct_time)共九个元素         time.localtime() 查看九个元素         九个元素如下:             tm_year=2016,   年             tm_mon=5,       月(1-12)             tm_mday=6,      日(1-31
py3study
2020/01/09
7580
python时间模块time和datet
python时间操作
1357548276.53 2013-01-07 08:44:36 1357519476.0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Mon Jan 07 16:44:36 2013 time.struct_time(tm_year=2013, tm_mon=1, tm_mday=7, tm_hour=16, tm_min=44, tm_sec=36, tm_wday=0, tm_yday=7, tm_isdst=0) 2013-01-07 16:44:36 Mon Jan 07 16:44:36 2013 1357548276.0 1357548276.0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2013-01-07 16:44:36.562000 2013-01-07 16:44:36562
py3study
2020/01/06
4830
Python模块知识2:时间日期日历模块Time、Datetime、Calendar
1、time模块 时间为什么从1970年开始:因为Linux系统那一年开始使用;通常由以下几种方式表示时间: 时间戳:1970年1月1日之后的秒,即:time.time()可以获得当前时间戳。 格式化的字符串:2014-11-11 11:11,如:time.strftime('%Y-%m-%d'),详见案例 结构化时间,为元组形式,包含了9个元素:年、日、星期等... 如:time.struct_time(tm_year=2017, tm_mon=5, tm_mday=27, tm_hour=15, tm_
企鹅号小编
2018/01/11
1.7K0
Python模块知识2:时间日期日历模块Time、Datetime、Calendar
记一次 Python 项目全量替换至 UTC 时区的重构经历(中)
上一篇文章中介绍了生成时间的格式汇总,本文将介绍将时间字符串转换为 Python 对象也就是解析的部分
远哥制造
2023/11/29
4520
python模块: time & datetime
在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。 UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移
程序员同行者
2018/06/22
1.1K0
你不得不会的python常用内置模块--time/random
在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
小草AI
2019/11/19
5340
python时间模块-time和datetime
python 中时间表示方法有:时间戳,即从1975年1月1日00:00:00到现在的秒数;格式化后的时间字符串;时间struct_time 元组。 struct_time元组中元素主要包括tm_year(年)、tm_mon(月)、tm_mday(日)、tm_hour(时)、tm_min(分)、tm_sec(秒)、tm_wday(weekday0 - 6(0表示周日))、tm_yday(一年中的第几天1 - 366)、tm_isdst(是否是夏令时)
Mirror王宇阳
2020/11/10
6170
python time与datetime模块
在python中,与时间处理相关的模块有:time、datetime以及calendar。学会计算时间,对程序的调优非常重要,可以在程序中狂打时间戳,来具体判断程序中哪一块耗时最多,从而找到程序调优的重心处。
py3study
2018/08/02
6610
time&datetime模块详解
 一.time模块 1.时间格式转换图: 2.time模块中时间表现的格式主要有三种:   a、timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量   b
用户1679793
2018/04/28
1.2K0
time&datetime模块详解
Python基础模块学习02
time是归类在常规操作系统服务中,它提供的功能更加接近于操作系统层面。模块通过系统底层的计时器获取自 epoch 以来经过的总秒数(可能为浮点数),即我们常说的 POSIX 时间戳(timestamp)
Linux运维技术之路
2022/06/07
4690
Python基础模块学习02
python--模块之time,date
表示时间的三种方式: 时间戳、格式化的时间字符串、元组 时间戳是计算机能够识别的时间; 时间字符串是我们能够看懂的时间; 元组是用来操作时间;
py3study
2020/01/19
5660
Python模块time和random
1、python程序架构 一个Python程序通常包括一个顶层程序文件和若干个模块文件。顶层文件包含了程序的主要控制流程,模块文件是为顶层文件或其他模块提供各种功能性组件,模块首次导入(或重载)时,Python会立即执行模块文件的顶层程序代码(不在函数内的代码),而位于函数主体内的代码直到函数被调用后才会执行。 2、模块的执行环境 模块是被导入的,但模块也可以导入和使用其他模块,这些模块可以用Python或其它编程语言写成 模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其它元素 3、导入
IT架构圈
2018/06/01
8430
python_time和datetime
struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。
py3study
2020/01/17
6210
python3 time模块与datet
在Python中,通常有这几种方式来表示时间: 1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素 由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
py3study
2020/01/03
4070
python time 与datetim
  第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的
py3study
2020/01/07
6370
Python_time模块
时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(Python中返回的是秒数,并且为float类型)
py3study
2020/01/19
5920
Python_time模块
相关推荐
Python时间处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验