以下基本我在日常写代码中,最常用的一些日期相关部分。
属性 | 说明 |
---|---|
tm_year | 年 |
tm_mon | 月(1~12) |
tm_mday | 日(1~31) |
tm_hour | 时(0~23) |
tm_min | 分(0~59) |
tm_sec | 秒(0~61, 60或61是闰秒) |
tm_wday | 星期(0~6, 0是周一) |
tm_yday | 第几天(1~366, 366是闰年) |
tm_isdst | 夏令时(1夏令时、0非夏令时、-1代表未知。平时写代码基本用不到。夏时令是指部分国家地区,夏季人为将时间调快一小时,早睡早起,以便充分利用夏日光照,节约用电。中国从1992年起就没有再执行过这个了) |
当前时间、时间戳、日期文本都可以返回时间元组属性
比如查询星期几
- w = time.localtime().tm_wday # 当前时间
- w = time.localtime(1558750679).tm_wday # 时间戳
- w = time.strptime('2019-05-25 07:46:45', "%Y-%m-%d %H:%M:%S").tm_wday # 日期文本
- print(type(w),w)
-
- # 输出结果
- <class 'int'> 5 # 代表星期六
-
无论是time或datetime,哪个模块都可以,具体怎么输出,自行调整格式参数'%Y-%m-%d %H:%M:%S'
%字符 | 表意 | 数值范围 |
---|---|---|
%y | 年(2位) | 00, 01, …, 99 |
%Y | 年(4位) | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%m | 月 | 01, 02, …, 12 |
%d | 日 | 01, 02, …, 31 |
%H | 时(24小时制) | 00, 01, …, 23 |
%M | 分 | 00, 01, …, 59 |
%S | 秒 | 00, 01, …, 59 |
更多符号含义,参看官方文档:
strftime | url |
---|---|
datetime | https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes |
time | https://docs.python.org/3/library/time.html#time.strftime |
【注意】:
time、datetime两种时间模块虽然都有strftime,但是(格式,时间)参数位置正好相反。
另外datetime的转义符号更全面,比如%f微秒,只有datetime有,time没有这个符号
time模块(格式在前,时间在后)
- import time
- t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
- print(type(t),t)
-
- # 输出结果
- <class 'str'> 2019-05-25 08:56:45
-
datetime模块(格式在后,时间在前)
- import datetime
- dt = datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d %H:%M:%S.%f')
- print(type(dt),dt)
-
- # 输出结果
- <class 'str'> 2019-05-25 08:56:45.405471
-
制定时间格式,进行解析
- import datetime
- dt = datetime.datetime.strptime('2019-05-25T07:46:45.743+0000','%Y-%m-%dT%H:%M:%S.%f%z')
- print(type(dt),dt)
-
- # 输出结果
- <class 'datetime.datetime'> 2019-05-25 07:46:45.743000+00:00
-
自动解析
- from dateutil.parser import parse
- dt = parse('2019-05-25 07:46:45')
- print(type(dt),dt)
-
- # 输出结果
- <class 'datetime.datetime'> 2019-05-25 07:46:45
-
该方法适用于很多类型时间格式,建议使用前自行测试
- dt = ["2001.07.04 AD at 12:08:56 PDT",
- "Wed, 4 Jul 2001 12:08:56 -0700",
- "190525",
- "2018-08-06T10:00:00.000Z",
- "Wed, Jul 4",
- "12:08 PM",
- "02001.July.04 AD 12:08 PM",
- "20190525083855-0700",
- "2001-07-04T12:08:56.235-0700",
- "Thu Oct 16 07:13:48 GMT 2014"]
-
- for i in dt:
- print(parse(i))
-
- # 输出结果
- 2001-07-04 12:08:56
- 2001-07-04 12:08:56-07:00
- 2025-05-19 00:00:00
- 2018-08-06 10:00:00+00:00
- 2019-07-04 00:00:00
- 2019-05-25 12:08:00
- 2001-07-04 12:08:00
- 2019-05-25 08:38:55-07:00
- 2001-07-04 12:08:56.235000-07:00
- 2014-10-16 07:13:48+00:00
-
但是注意,国外日期时间的常用格式和国内不一样。单写19-05-25会被解析成2025年5月19日
- print(parse("19-05-25"))
-
- # 输出结果
- 2025-05-19 00:00:00
-
如果是2019-05-25就不会错了
- print(parse("2019-05-25"))
-
- # 输出结果
- 2019-05-25 00:00:00
-
生成10或13位时间戳(做一些网页爬虫或构造提交时候可能用到)
- import time
- t = time.time()
- print(type(t),t)
- print('10位时间戳:',str(int(t)))
- print('13位时间戳:',str(int(t*1000)))
-
- # 输出结果
- <class 'float'> 1558750679.0872486
- 10位时间戳: 1558750679
- 13位时间戳: 1558750679087
-
10位整数时间戳转时间文本
- import time
- t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(1517302458))
- print(type(t),t)
-
- # 输出结果
- <class 'str'> 2018-01-30 16:54:18
-
任意格式时间戳转日期时间(int / float / str 均可)
- import datetime
- ts = '1517302458364134' # 该时间戳为int,float,string均可
- dt1 = datetime.datetime.fromtimestamp(int((str(ts).strip().replace(".","")+'000000')[:16])/1000000.0)
- print(type(dt1),dt1)
-
- # 输出结果
- <class 'datetime.datetime'> 2018-01-30 16:54:18.364134
-
任意格式时间戳转日期时间文本(int / float / str 均可)
- import datetime
- ts = '1517302458364134' # 该时间戳为int,float,string均可
- dt1 = datetime.datetime.strftime(datetime.datetime.fromtimestamp(int((str(ts).strip().replace(".","")+'000000')[:16])/1000000.0),'%Y-%m-%d %H:%M:%S.%f')
- print(type(dt1),dt1)
-
- # 输出结果
- <class 'str'> 2018-01-30 16:54:18.364134
-
两个datetime对象的差会产生一个<datetime.timedelta>类型的时间差
- from dateutil.parser import parse
- td = parse('2019-12-16 16:18:37')-parse('2018-01-30 16:54:18')
- print(type(td),td)
-
- # 输出结果
- <class 'datetime.timedelta'> 684 days, 23:24:19
-
打印出来的时间差已经被格式化了
实际上是这样的:datetime.timedelta(days=684, seconds=84259)
你可以将时间差格式化成你需要的形式, 比如:
- print('相差{0}天{1:.1f}小时'.format(td.days,td.seconds/60/60))
-
- # 输出结果
- 相差684天23.4小时
-
有的时候你需要的不是两个日期之间的差值,
而是当前日期加上某个时间长度后的日期是多少
比如: 太上老君在2019-12-16 13:31:57开炉炼丹 ,丹炉炼丹需要七七四十九天, 问什么时候练成
- import datetime
- dt = '2019-12-16 13:31:57'
- td = datetime.timedelta(days=49,seconds=0) # 构造一个49天的时间差
- datetime.datetime.strftime(parse(dt)+td,'%Y-%m-%d %H:%M:%S')
- print(type(dtNew),dtNew)
-
- # 输出结果
- <class 'str'> 2020-02-03 13:31:57
-
直接获取0时区的datetime,并转化为东8区datetime。
- import datetime
- dt0 = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc) # 展现获取0时区时间
- dt8 = dt0.astimezone(datetime.timezone(datetime.timedelta(hours=8))) # 转换时区到东八区
- print('UTC协调世界时 \t%s\nUTC+8北京时间\t%s'%(dt0,dt8))
-
- # 输出结果
- UTC协调世界时 2021-02-07 07:42:39.797093+00:00
- UTC+8北京时间 2021-02-07 15:42:39.797093+08:00
-
在碰到2019-05-25T02:48:54.281741+00:00这样的时间文本时,
就可以让其转换为东八区时间
- import datetime
- from dateutil.parser import parse
- dt0 = parse('2019-05-25T02:48:54.281741+00:00')
- dt8 = dt0.astimezone(datetime.timezone(datetime.timedelta(hours=8)))
- print(dt0,'UTC协调世界时',type(dt0))
- print(dt8,'UTC+8北京时间',type(dt8))
-
- # 输出结果
- 2019-05-25 02:48:54.281741+00:00 UTC协调世界时 <class 'datetime.datetime'>
- 2019-05-25 10:48:54.281741+08:00 UTC+8北京时间 <class 'datetime.datetime'>
-