文章目录
一、ISO 8601日期时间
1. 简介
国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》
2. 格式
-
ISO 8601日期格式
YYYY-MM-DDThh:mm:ss[.mmm]TZD
各字段含义如下:
字段 含义 YYYY
表示四位数的年份 MM
表示两位数的月份 DD
表示两位数的天(day of the month),从01到31 T
是用来指示时间元素的开始字符 hh
表示两位数的小时,从00到23,不包括AM/PM mm
表示两位数的分钟,从00到59 ss
表示两位数的秒,从00到59 mmm
表示三位数的毫秒数,从000到999 TZD
表示时区指示符:Z或+hh:mm或-hh:mm,+或-表示时区距离UTC(世界标准时间)时区多远。
例如:CST(中国标准时间):UTC +08:00,EST(东部标准时间):UTC -05:00,CST(中部标准时间):UTC -06:00 -
样例
2022-07-24T00:14:01.954+08:00
:表示世界标准时间UTC为2022年07月24日00点14分01秒954毫秒,当前地区所在时区距离UTC标准时提前08时00分
3. 时区划分
- 世界时区图
地球上共有360度经度,按照15度一个时区,将全球分为24个时区。以0度经线开始计算,往东方向,依次分为东一区、东二区、东三区…东十二区;往西方向,依次为西一区、西二区、西三区…西十二区。其中西十二区和东十二区共占一个时区,成为东西十二区。其中,中时区即世界标准时间UTC,向东每经过一个时区,+1小时,向西每经过一个 时区,-1小时。例如首都北京处于东八区,那么就+8小时,即2022-07-24T00:14:01.954+08:00中的+08:00
二、Python处理ISO 8601日期时间
1. 将 ISO 8601 转化为 UTC 标准日期时间 / 本地时间
- 截取UTC 标准日期时间
2022-07-24T00:14:01.954+08:00
—>2022-07-24 00:14:01
import time
t0 = '2022-07-24T00:14:01.954+08:00'
format1 = "%Y-%m-%dT%H:%M:%S.%f+08:00"
t1 = time.strptime(t0, format1) # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=14, tm_sec=1, tm_wday=6, tm_yday=205, tm_isdst=-1)
format2 = "%Y-%m-%d %H:%M:%S"
t2 = time.strftime(format2, t1) # 2022-07-24 00:14:01
- 转化为本地日期时间
2022-07-24T00:14:01.954+08:00
—>2022-07-24 08:14:01
import dateutil.parser
from datetime import timezone
# 将字符串时间 转化为 datetime 对象
dateObject = dateutil.parser.isoparse('2022-07-24T00:14:01.954+08:00') # 2022-07-24 00:14:01.954000+08:00
# 根据时区 转化为 datetime 数据
localdt = dateObject.replace(tzinfo=timezone.utc).astimezone(tz=None) # 2022-07-24 08:14:01.954000+08:00
# 产生本地格式 字符串
localtime = localdt.strftime('%Y-%m-%d %H:%M:%S') # 2022-07-24 08:14:01
2. 两个 ISO 8601 日期时间的差值
2022-07-24T00:14:02.954+08:00
- 2022-07-24T00:14:01.954+08:00
= 01s
from datetime import datetime
format = "%Y-%m-%dT%H:%M:%S.%f+08:00"
t0 = '2022-07-24T00:14:01.954+08:00'
t1 = '2022-07-24T00:14:02.954+08:00'
s0 = datetime.strptime(t0, format)
s1 = datetime.strptime(t1, format)
sub = (s1 - s0).seconds # 1
3. 时间戳转ISO 8601日期时间
2022-07-24 01:40:02.867706
—>2022-07-23T17:40:02.867706+08:00
import time
import datetime
# datetime时间戳
t0 = datetime.datetime.now() # 2022-07-24 01:40:02.867706
# ISO 8601本地
t1 = datetime.datetime.now().isoformat() # 2022-07-24T01:40:02.867706
# UTC至ISO 8601
t2 = datetime.datetime.utcnow().isoformat() # 2022-07-23T17:40:02.867706
# 本地到ISO 8601没有微秒
t3 = datetime.datetime.now().replace(microsecond=0).isoformat() # 2022-07-24T01:40:02
# 带有TimeZone信息的UTC到ISO 8601
t4 = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() # 2022-07-23T17:40:02.867706+00:00
# 带有TimeZone信息的本地ISO 8601
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
t5 = datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat() # 2022-07-24T01:40:02.867706+08:00
参考
ISO 8601日期格式与持续时间格式
世界时区
地理小常识:时区的计算
python 时间戳转iso 8601_Python中的ISO时间(ISO 8601)
python中时间转换
python-ISO格式 转化为 本地时间