“一起学习,一起成长!“
【连续“Python系统:日期和时间1”】
3. 读写日期和时间
3.1 strftime()的格式化字符串
可以使用strftime()把日期和时间转换成字符串。这个方法在datetime,date,time对象中都有,在time模块中也有。strftime()使用格式化字符串来指定输出。
格式化字符串 日期/时间单元 范围
%Y 年 1900-..
%m 月 01-12
%B 月名 January
%b 月名缩写 Jan,...
%d 日 01-31
%A 星期 Sunday
%a 星期缩写 Sun,...
%H 时(24小时制) 00-23
%I 时(12小时制) 01-12
%p 上午/下午 AM,PM
%M 分 00-59
%S 秒 00-59
数字都是左侧补零。
3.2time模块中的strftime()函数:把struct_time对象转换成字符串
strftime()函数:
把struct_time对象转换成字符串。
import time
fmt="It's %A,%B %d,%Y,local time %I:%M:%S%p"
t=time.localtime()
t
Out[31]: time.struct_time(tm_year=2018, tm_mon=7, tm_mday=1, tm_hour=12, tm_min=26, tm_sec=33, tm_wday=6, tm_yday=182, tm_isdst=0)
time.strftime(fmt,t)
Out[32]: "It's Sunday,July 01,2018,local time 12:26:33PM"
3.3 date对象的strftime()函数:只能获取日期部分,时间默认是午夜
date对象的strftime()函数:只能获取日期部分,时间默认是午夜。
from datetime import date
some_day=date(2014,7,4)
fmt="It's %B %d,%Y,local time %I:%M:%S%p"
some_day.strftime(fmt)
Out[37]: "It's July 04,2014,local time 12:00:00AM"
3.4time对象只会转换时间部分
from datetime import time
some_time=time(10,35)
some_time.strftime(fmt)
Out[40]: "It's January 01,1900,local time 10:35:00AM"
如果要把字符串转换成日期或者时间,可以对同样的格式化字符串使用strptime()函数。这里不能使用正则表达式,字符串的非格式化部分(没有%的部分)必须完全匹配。
import time
fmt="%Y-%m-%d"
time.strptime("2012 01 29",fmt)
Traceback (most recent call last):
File "<ipython-input-43-e30fa5587874>", line 1, in <module>
#目标字符串中用空格代替破折号,解析式时会报错:
time.strptime("2012 01 29",fmt)
File "E:anocondalib_strptime.py", line 559, in _strptime_time
tt = _strptime(data_string, format)[0]
File "E:anocondalib_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '2012 01 29' does not match format '%Y-%m-%d'
#如果传入strptime()字符串中有破折号,可以正常解析。
time.strptime("2012-01-29",fmt)
Out[44]: time.struct_time(tm_year=2012, tm_mon=1, tm_mday=29, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=29, tm_isdst=-1)
#即使字符串看起来可以匹配格式,但如果超出取值范围也会报错:
time.strptime("2012-13-29",fmt)
Traceback (most recent call last):
File "<ipython-input-45-7c19c6368395>", line 1, in <module>
time.strptime("2012-13-29",fmt)
File "E:anocondalib_strptime.py", line 559, in _strptime_time
tt = _strptime(data_string, format)[0]
File "E:anocondalib_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '2012-13-29' does not match format '%Y-%m-%d'
1) 目标字符串中用空格代替破折号,解析式时会报错
2) 如果传入strptime()字符串中有破折号,可以正常解析。
3) 即使字符串看起来可以匹配格式,但如果超出取值范围也会报错
4) 名称通过locale设置,这时操作系统中的国际化设置。
5) setlocale()设置:打印出不同的月和日名称。
名称通过locale设置,这时操作系统中的国际化设置。如果要打印出不同的月和日名称,可以通过setlocale()设置来修改。
这个函数的第一个参数是locale.LC_TIME。表示设置的是日期和时间。
第二个参数是一个结合了语言和国家名称的缩写字符串。
#为什么会报错,可能是模块发生变化,查证一下。
>>> import locale
>>> from datetime import date
>>> halloween=date(2014,10,31)
>>> for lang_country in ['en_us','fr_fr','de_de','es_es','is_is',]:
... locale.setlocale(locale.LC_ALL,lang_country)
... halloween.strftime('%A,%B %d')
...
'en_us'
'Friday,October 31'
'fr_fr'
'vendredi,octobre 31'
'de_de'
'Freitag,Oktober 31'
'es_es'
'viernes,octubre 31'
'is_is'
'föstudagur,október 31'
上述红色部分书上是错误的,应该是更新了的缘故。
6) 获取lang_country的方法(有好几百种)
获取lang_country所有值:
>>> import locale
>>> names=locale.locale_alias.keys()
查看前五:
>>> good_names=[name for name in names if len(name)==5 and name[2]=='_']
>>> good_names[:5]
['a3_az', 'aa_dj', 'aa_er', 'aa_et', 'af_za']
4. 其他模块
如果觉得标准库模块不好用或者没有想要的功能,可以试试下面这些第三方模块:
arrow(http://crsmithdev.com/arrow/)
这个模块有许多日期和时间函数,并提供了简单易用的API
dateutil(http://labix.org/python-dateutil)
这个模块可以解析绝大多数日期格式,并且可以很好地处理相对日期和时间
iso8601(https://pypi.python.org/pypi/iso8601)
这个模块会完善标准库中对于ISO8601格式的处理
fleming(http://github.com/anbitioninc/fleming)
这个模块提供许多时区函数
「亲,如果笔记对您有帮助,收藏的同时,记得给点个赞、加个关注哦!感谢!」
「诚邀关注“issnail”,会有惊喜哦!」
「文中代码均亲测过,若有错误之处,欢迎批评指正,一起学习,一起成长!」
参考书目:python语言及其应用