strftime 时间格式化

我们先看下下面的两段代码,他们的结果是一样的,不同的在于导入包和引用时候的区别:通常使用第二种,引用时候方便些。
注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。

如果仅导入import datetime,则必须引用全名datetime.datetimedatetime.now()返回当前日期和时间,其类型是datetime

  1. import datetime
  2. time1 = datetime.datetime.now().strftime('%Y') # 获取当前时间,取年
  3. time2 = datetime.datetime.now().strftime('%Y/%m') # 获取当前时间,取年月
  4. time3 = datetime.datetime.now().strftime('%Y/%m/%d') # 获取当前时间,取年月日
  5. print(time1)
  6. print(time2)
  7. print(time3)
  1. from datetime import datetime
  2. time1 = datetime.now().strftime('%Y') # 获取当前时间,取年
  3. time2 = datetime.now().strftime('%Y/%m') # 获取当前时间,取年月
  4. time3 = datetime.now().strftime('%Y/%m/%d') # 获取当前时间,取年月日
  5. print(time1)
  6. print(time2)
  7. print(time3)

Python的datetime模块 其实就是date和time模块的结合,常见的属性方法都比较常用

  1. from datetime import datetime
  2. dt = datetime.now() # 创建一个datetime类对象
  3. print(dt) # 结果是 2021-01-18 17:18:53.628645 秒后面还有六位小数
  4. print(dt.day) # 结果是18
  5. print(dt.month) # 结果是1
  6. print(dt.year) # 结果是2021

另一个方法: strftime() 用来格式化datetime 对象, 有时候会十分的方便:格式是 datetime.strftime(‘%’ ) ,百分号后面跟一个控制字符,如下:

格式符 说明
%a 星期的英文单词的缩写:如星期一, 则返回 Mon
%A 星期的英文单词的全拼:如星期一,返回 Monday
%b 月份的英文单词的缩写:如一月, 则返回 Jan
%B 月份的引文单词的缩写:如一月, 则返回 January
%c 返回datetime的字符串表示,如03/08/15 23:01:26
%d 返回的是当前时间是当前月的第几天
%f 微秒的表示: 范围: [0,999999]
%H 以24小时制表示当前小时
%I 以12小时制表示当前小时
%j 返回 当天是当年的第几天 范围[001,366]
%m 返回月份 范围[0,12]
%M 返回分钟数 范围 [0,59]
%P 返回是上午还是下午–AM or PM
%S 返回秒数 范围 [0,61]。。。手册说明的
%U 返回当周是当年的第几周 以周日为第一天
%W 返回当周是当年的第几周 以周一为第一天
%w 当天在当周的天数,范围为[0, 6],6表示星期天
%x 日期的字符串表示 :03/08/15
%X 时间的字符串表示 :23:22:08
%y 两个数字表示的年份 15
%Y 四个数字表示的年份 2015
%z 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z 时区名称(如果是本地时间,返回空字符串)

举个例子

  1. from datetime import datetime
  2. dt = datetime.now()
  3. print('时间:(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f'))
  4. print('时间:(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p'))
  5. print('星期缩写%%a: %s ' % dt.strftime('%a'))
  6. print('星期全拼%%A: %s ' % dt.strftime('%A'))
  7. print('月份缩写%%b: %s ' % dt.strftime('%b'))
  8. print('月份全批%%B: %s ' % dt.strftime('%B'))
  9. print('日期时间%%c: %s ' % dt.strftime('%c'))
  10. print('今天是这周的第%s天 ' % dt.strftime('%w'))
  11. print('今天是今年的第%s天 ' % dt.strftime('%j'))
  12. print('今周是今年的第%s周 ' % dt.strftime('%U'))
  13. print('今天是当月的第%s天 ' % dt.strftime('%d'))
  14. # 结果是 ____________________________________
  15. '''
  16. 时间:(%Y-%m-%d %H:%M:%S %f): 2021-01-18 17:24:12 406659
  17. 时间:(%Y-%m-%d %H:%M:%S %p): 21-01-18 05:24:12 PM
  18. 星期缩写%a: Mon
  19. 星期全拼%A: Monday
  20. 月份缩写%b: Jan
  21. 月份全批%B: January
  22. 日期时间%c: Mon Jan 18 17:24:12 2021
  23. 今天是这周的第1天
  24. 今天是今年的第018天
  25. 今周是今年的第03周
  26. 今天是当月的第18天
  27. '''

datetime / timestamp

datetime转timestamp(timestamp)

在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp。

为了方便理解,你可以把 timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00 对应的北京时间是 timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00。

实际上,全球各地的计算机在任意时刻的timestamp都是完全相同的(假定时间已校准),区别只是时区不同(可以理解为大家使用同一个计算方式,就好比货币统一一样,大家用一个标准才好计算)。

调用timestamp()方法:

  1. from datetime import datetime
  2. dt = datetime(2021, 1, 1, 12, 30) # 用指定日期时间创建datetime
  3. print(dt.timestamp()) # 把datetime转换为timestamp
  4. # 1609475400.0

注意Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。

timestamp转datetime(fromtimestamp)

我们用上一步计算出的timestamp值进行转化:

  1. from datetime import datetime
  2. t = 1609475400.0
  3. print(datetime.fromtimestamp(t))
  4. # 2021-01-01 12:30:00

注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。(不管时区,只计算本地时间-1970.1.1之间的差)

本地时间是指当前操作系统设定的时区。比如 2020-06-21 12:20:00 ,实际上就是UTC+8:00时区的时间:
2020-06-21 12:20:00 UTC+8:00,而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:2020-06-21 04:20:00 UTC+0:00

timestamp也可以直接被转换到UTC标准时区的时间:

  1. from datetime import datetime
  2. t = 1609475400.0
  3. print(datetime.fromtimestamp(t)) # 本地时间
  4. # 2021-01-01 12:30:00
  5. print(datetime.utcfromtimestamp(t)) # UTC时间
  6. # 2021-01-01 04:30:00

str / datetime


str转datetime(strptime)

  1. from datetime import datetime
  2. cday = datetime.strptime('2021-1-25 18:19:59', '%Y-%m-%d %H:%M:%S')
  3. print(cday) # 2021-01-25 18:19:59
  4. print(type(cday)) # <class 'datetime.datetime'>

字符串’%Y-%m-%d %H:%M:%S’规定了日期和时间部分的格式。

datetime转str(strftime)

  1. from datetime import datetime
  2. now = datetime.now()
  3. print(now.strftime('%a, %b %d %H:%M')) # Mon, Jan 25 13:29
  4. print(type(now.strftime('%a, %b %d %H:%M'))) # <class 'str'>

datetime加减

对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+-运算符,不过需要导入timedelta这个类:

  1. from datetime import datetime, timedelta
  2. now = datetime.now()
  3. print(now) # 2021-01-25 13:37:05.096548
  4. print(now + timedelta(hours=10))
  5. # 加10小时,2021-01-25 23:37:05.096548
  6. print(now - timedelta(days=1))
  7. # 减去一天,2021-01-24 13:37:05.096548
  8. print(now + timedelta(days=2, hours=12))
  9. # 加上两天俩小时 2021-01-28 01:37:05.096548
  1. yesterday = datetime.today() + timedelta(-1) # timedelta模块是计算时间差的,-1就是昨天
  2. # 结果是 2021-01-23 16:14:53.117840
  3. yesterday = yesterday.strftime('%Y/%m')