同福

Python的日期和时间的使用技巧【20210407】

介绍

介绍

今天福哥将要给大家讲解Python编程基础知识日期和时间的使用技巧,这个技术在程序开发时候的使用率还是非常高的,基本上95%以上的项目都离不开日期和时间的应用场景。

关于日期和时间还是有很多知识需要了解的,如果不清楚这些的话,就会遇到很多奇怪的问题。在很多对时间控制很严格的系统里面会有非常复杂的时间处理逻辑,如果没有很好的使用经验甚至功能都无法实现。例如:昨天是什么日子?距离下一个周末还有几天?今年有多少个工作日?想要解决这些问题还是需要好好学习一下日期和时间的使用技巧的。

时区

时区时间

地球是圆的,处于不同经度地区的人看到的时间是不一样的,在一条经度上的人看到的时间是一样的。所以我们在描述一个时间的时候都会以当地经度上的一个主要城市为准计算当地的时间,例如:北京时间,东京时间,伦敦时间,纽约时间等等。

处于不同经度地区的人看到的时间之间是有差的,这个差就是我们常说的时差。服务器也是存在于某一个经度地区的,所以跨时区操作网站的时候就会有时差问题。

为了解决这个问题程序默认会以一个公共时区UTC的时间为基准,大家都以这个UTC时区的时间记录具体时间,在显示的时候可以根据所在时区与UTC时区的偏移经度计算时差,从而得到本地时区正确的具体时间。

安装

Python处理日期和时间有两个库可以用,一个是time库,另外一个是datetime库,datetime库包括了几个非常好用的子类,福哥推荐使用datetime库。

from datetime import *
import time

当前时间

UTC时间

前面介绍时区的时候说过了,为了便于针对不同经度地区的人显示当地的时间系统里面存储的最好是UTC时间,在datetime里是utcnow方法,而time里则是gmtime方法。

datetime

print("当前UTC时间")
print(datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))

time

print("当前UTC时间")
print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))

本地时间

如果要得到对应本地时区的时间需要使用datetime的now方法或者time的time方法进行时间的获取。

datetime

print("当前时区时间")
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

time

print("当前时区时间")
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

创建时间

如果我们要创建一个时间(或者说是指定一个具体的时间)需要用到datetime对象。

datetime对象的构造器可以顺序传入年、月、日、时、分、秒的定制参数,用来构造一个特定时间。

print("创建时间")
print(datetime(2021, 4, 7, 21, 56, 38).strftime("%Y-%m-%d %H:%M:%S"))

时间偏移

时间偏移就是根据当前时间向前(过去)或者向后(未来)进行推移得到一个过去时间或者未来时间。

时间偏移福哥就只使用datetime对象来实现了,因为time本身没有类似timedelta的工具,而且datetime对象拥有更多的便捷方法。

未来

将当前时间向后偏移可以计算未来的某个时间点。

print("明天")
print((datetime.now()+timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S"))
print("下周的今天")
print((datetime.now()+timedelta(days=7)).strftime("%Y-%m-%d %H:%M:%S"))
print("距离最近的周日还有" + str(7-datetime.now().isoweekday()) + "天")
print("下个月的今天是周" + str((datetime.now()+timedelta(days=30)).isoweekday()))

home/topic/2021/0407/15/c1fe88474df775f54a9db418c7a96bda.jpg

过去

将当前时间向前偏移可以计算未来的某个时间点。

print("昨天")
print((datetime.now()+timedelta(days=-1)).strftime("%Y-%m-%d %H:%M:%S"))
print("上周的今天")
print((datetime.now()+timedelta(days=-7)).strftime("%Y-%m-%d %H:%M:%S"))
print("8月8日出生的人去年的生日那天是周" + str((datetime(2021, 8, 8)+timedelta(days=-365)).isoweekday()))
print("8月8日出生的人自上次生日到今天过了" + str(int((datetime.now().timestamp()-(datetime(2021, 8, 8)+timedelta(days=-365)).timestamp())/(3600*24))) + "天")

datetime的timestamp方法在python2里面是没有的,而且time的time方法在python2里面也是没有的。

简单说就是python2没有直接的方法可以拿到一个具体时间的时间戳,真是坑爹啊~~

home/topic/2021/0407/16/75d0c6f60dff7fa3f825906a84623cc3.jpg

格式化

在我们将系统时间输出出来的时候可以通过datetime的strftime方法或者time的strftime方法提供的一些字符进行格式的自定义,下面是福哥从官网找出来的格式说明,大家可以参考看看。

格式

  • %a:当地工作日的缩写。

  • %A:本地化的星期中每日的完整名称。

  • %w:以十进制数显示的工作日,其中0表示星期日,6表示星期六。

  • %d:补零后,以十进制数显示的月份中的一天。

  • %b:当地月份的缩写。

  • %B:本地化的月份全名。

  • %m:补零后,以十进制数显示的月份。

  • %y:补零后,以十进制数表示的,不带世纪的年份。

  • %Y:十进制数表示的带世纪的年份。

  • %H:以补零后的十进制数表示的小时(24 小时制)。

  • %I:以补零后的十进制数表示的小时(12 小时制)。

  • %p:本地化的 AM 或 PM 。

  • %M:补零后,以十进制数显示的分钟。

  • %S:补零后,以十进制数显示的秒。

  • %f:以十进制数表示的微秒,在左侧补零。

  • %z:UTC 偏移量,格式为 ±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串)。

  • %Z:时区名称(如果对象为简单型则为空字符串)。

  • %j:以补零后的十进制数表示的一年中的日序号。

  • %U:以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。

  • %W:以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周

  • %c:本地化的适当日期和时间表示。

  • %x:本地化的适当日期表示。

  • %X:本地化的适当时间表示。

  • %%:字面的 '%' 字符。

UTC时间转本地时间

时区转换需要用到pytz库,这个库需要单独安装一下,直接使用pip安装即可。

通过pytz转换时区需要知道原来的时区和目标的时区,然后通过datetime对象的replace方法和astimezone方法完成时区转换。

安装pytz

pip install pytz

时区转换

print("UTC时间")
print(nowUTC)
print("通过UTC时间转化为本地时间")
tzUTC = pytz.timezone("UTC")
tzLocal = pytz.timezone("Asia/Shanghai")
print(nowUTC.replace(tzinfo=tzUTC).astimezone(tzLocal))

home/topic/2021/0407/17/fba3a24675f10e5143b110b738e9b740.jpg

总结

今天福哥带着童鞋们对于Python操作日期和时间的技巧系统地学习了一下,相信经过今天的课程之后童鞋们对于在程序里面使用日期和时间的功能会变得得心应手了。

下一课福哥会给大家讲解Java语言的日期和时间的使用技巧。Java不同于PHP和Python,用于操作日期和时间的对象特别多,使用这些对象编程的时候就不可避免的需要转换来转换去的,所以下一课福哥最后会给出Java操作日期和时间的这些对象之间相互转换的方法。