python中的datetime --- 操作日期和时间

145 阅读3分钟

前言

在开发时,总会遇到需要处理时间的地方。在python中,一个比较好的处理方式就是使用datetime模块,对日期的操作都有实现,还能设置时间的时区,获得两个时间的差值。下面将对常见的用法进行介绍。

1.datetime模块常用类

  • class datetime.date 日期类,没有花里胡哨的东西,属性只有year,month,day

  • class datetime.time 时间类,属性为hour(0~23),minute,second,microsecond,tzinfo,fold

    • 前三个属性基本就满足我们的需求了,microsecond为秒级别,取值为0~999999
    • tzinfo全名为timezoneInfo,其实就是时区信息,负责获取时区信息,本地时间与UTC的差值等
    • fold[0,1]用于在重复时间段中消除边界时间的歧义。(时区问题,具体可看以下参考资料)
  • class datetime.datetime 时间和日期的结合。

  • class datetime.timedelta 获得两个datetime或date实例的差值,结果能转换为各个单位,year,month,day等

2.常见用法

  • date和datetime,都能通过today方法获得当前的系统时间

  • 最常用的方法如下:

strptime: 类方法 p表示parse,表示分析的意思,所以strptime是给定一个时间字符串和分析模式,返回一个时间对象
strftime: 实例方法 f表示format,表示格式化,和strptime正好相反,要求给一个时间对象和输出格式,返回一个时间字符串

QQ_1722931304764.png

datetime.strptime('31/01/22 23:59:59.999999',
...                   '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'

QQ_1722931429718.png

3.时区问题

其中的坑就有%Z,在时区为CST(中国标准时间)时,识别不出来,抛出异常ValueError,因为他内部没有这个时区,因此在遇到有时区时,最好将字符串切片解析,单独将时区拎出来处理。

关于时区ETC/GMT设置问题: 使用Linux设定时区时,若是选用Etc底下的GMT时区,可能会发现设定的结果与你预想的不同,当你想设定北京的时区(GMT+8) ,但设定完后,系统时间却是-8的时区,和北京时间相差16小时,原因是因为Etc底下的GMT时区是以格林威治以西为正,以东为负,刚好与我们现实生活的认知相反。

而原因只是因为当初Unix 多为西方人使用,便以西为正

4.总结

在目前刚学python时,获取android的时间,在解析时间时由于CST时区的影响,代码一直抛异常。因此就去系统学习了datetime这一模块,感觉其实总体来说就最后那两个方法最实用耐用,如果在操作海外的时间时,就要注意时区问题:夏令时等,这个在接触后会更新。

5.参考资料

[python官方文档](datetime --- 基本日期和时间类型 — Python 3.12.4 文档)

[时区的历史](彻底弄懂GMT、UTC、时区和夏令时 - champyin - 博客园 (cnblogs.com))