首页 » Python » 正文

Python中datetime模块操作详解

继续清理笔记,都是一些基本操作详解之类的,原则以datetime为中心, 起点或中转, 转化为目标对象. 源码分析以及在做系统中一些细节难点等, 后续会放出, 其中涵盖了大多数业务场景中需要的日期转换处理, 适合老司机翻阅.

日期和时间有两种类型:“naive” 和 “aware”. 简单说naive就是不知道时区信息的对象,仅表示协调世界时(UTC); 而aware对象则具有时区和夏令时信息,用于表示时间的一个特定时刻(对于需要aware对象的程序,可以参考第三方库:pytz)

datetime.date
表示日期的类

>>> import datetime
>>> import time

# year 的范围是[1,9999]
# month 的范围是[1,12]
# day 的最大值根据给定的year, month来决定. 例如闰年2月有29天
>>> d = datetime.date(2017, 5, 6)

# date.max、date.min: data对象所能表示最大、最小日期
>>> print(d.max)
9999-12-31

# 常用的属性有year, month, day
>>> print(d.year)
2017

# 根据给定的时间戳,返回一个date对象
>>> t = datetime.date.fromtimestamp(time.time())
>>> print(t)
2017-05-06

# date对象表示日期的最小单位。这里是天
>>> r = datetime.date.resolution
>>> print(r)
1 day, 0:00:00

# 返回本地当前日期的date对象
>>> td = datetime.date.today()
>>> print(td)
2017-05-06

date提供的实例方法和属性:

  • date.replace(year, month, day): 生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性(原有对象仍保持不变)
  • date.timetuple():  返回日期对应的time.struct_time对象
  • date.toordinal():  返回日期对应的Gregorian Calendar日期
  • date.weekday():  返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
  • data.isoweekday():  返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
  • date.isocalendar():  返回格式如(year,month,day)的元组
  • date.isoformat():   返回格式如’YYYY-MM-DD’的字符串
  • date.strftime(fmt):  自定义格式化字符串
  • date.toordinal():  返回公历日期顺序(序数)
  • data.fromordinal(ordinal):  返回该序数的日期
import datetime
n = datetime.date(2017, 5, 6)
t = n.replace(day=7)
print("now:", n, "tomorro:", t)
print("timetuple():", n.timetuple())
print("weekday():", n.weekday())
print("isoweekday():", n.isoweekday())
print("isocalendar():", n.isocalendar())
print("isoformat():", n.isoformat())
print("toordinal():",n.toordinal())
od = n.fromordinal(n.toordinal())
print("fromordinal(ordinal):", od)

# # --- 结果 ---
# now: 2017-05-06 tomorro: 2017-05-07
# timetuple(): time.struct_time(tm_year=2017, tm_mon=5, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=126, tm_isdst=-1)
# weekday(): 5
# isoweekday(): 6
# isocalendar(): (2017, 18, 6)
# isoformat(): 2017-05-06
# toordinal(): 736455
# fromordinal(ordinal): 2017-05-06

date还对某些操作进行了重载,它允许我们对日期进行如下一些操作:

  • date2 = date1 + timedelta # 日期加上一个间隔,返回一个新的日期对象(timedelta将在下面介绍,表示时间间隔)
  • date2 = date1 – timedelta # 日期减去间隔,返回一个新的日期对象
  • timedelta = date1 – date2 # 两个日期相减,返回一个时间间隔对象
  • date1 < date2 # 两个日期进行比较,返回bool值 注: 对日期进行操作时,要防止日期超出它所能表示的范围
n = datetime.date.today()
t = n.replace(day = 9)
delta = t - n
print("now:", n, "tomorrow:", t)
print("timedelta:", delta)
print(n + delta * 5)
print(t > n)

# # --- 结果 ---
# now: 2017-05-07 tomorrow: 2017-05-09
# timedelta: 2 days, 0:00:00
# 2017-05-17
# True

datetime.time
表示时间,由时、分、秒以及毫秒组成, 类提供的实例方法和属性:

  • time.min、time.max: time类所能表示的最小, 最大时间. 其中, time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999)
  • time.hour、time.minute、time.second、time.microsecond: 时、分、秒、毫秒
  • time.resolution: 时间的最小单位,这里是1毫秒
  • time.tzinfo:  时区信息
  • time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]): 返回新的时间对象,用参数指定的时,分,秒,毫秒代替原有对象中的属性(原有对象仍不变)
  • time.isoformat():返回如”HH:MM:SS”格式的字符串表示
  • time.strftime(fmt):返回自定义格式化字符串
t = datetime.time(22, 5, 10)
print("t:", t)
print("hour: %d, minute: %d, second: %d, microsecond: %d:"%(t.hour, t.minute, t.second, t.microsecond))
t1 = t.replace(minute=30)
print("t1:", t1)
print("isoformat():", t.isoformat())
print("strftime(fmt):", t.strftime("%X"))

# # --- 结果 ---
# t: 22:05:10
# hour: 22, minute: 5, second: 10, microsecond: 0:
# t1: 22:30:10
# isoformat(): 22:05:10
# strftime(fmt): 22:05:10

datetime.datetime
表示日期时间,是date与time的结合体,包括date与time的所有信息,其定义的类属性与方法:

  • datetime.min、datetime.max:  datetime所能表示的最小值与最大值
  • datetime.resolution:  datetime最小单位(毫秒)
  • datetime.today(): 返回一个表示当前本地时间的datetime对象
  • datetime.now([tz]): 返回一个表示当前本地时间的datetime对象,若提供了参数tz,则获取tz参数所指时区的本地时间
  • datetime.utcnow(): 返回一个当前utc时间的datetime对象
  • datetime.fromtimestamp(timestamp[, tz]): 根据时间戮创建一个datetime对象, 参数tz指定时区信息
  • datetime.utcfromtimestamp(timestamp): 根据时间戮创建一个datetime对象
  • datetime.combine(date, time): 根据date和time, 创建一个datetime对象
  • datetime.strptime(date_string, format): 将格式字符串转换为datetime对象
import datetime
import time

print("datetime.max:", datetime.datetime.max)
print("datetime.resolution:", datetime.datetime.resolution)
print("datetime.today():", datetime.datetime.today())
print("datetime.now():", datetime.datetime.now())
print("datetime.utcnow():", datetime.datetime.utcnow())
print("datetime.utcfromtimestamp()", datetime.datetime.utcfromtimestamp(time.time()))

# # --- 结果 ---
# datetime.max: 9999-12-31 23:59:59.999999
# datetime.resolution: 0:00:00.000001
# datetime.today(): 2017-05-07 23:32:51.092241
# datetime.now(): 2017-05-07 23:32:51.092261
# datetime.utcnow(): 2017-05-07 15:32:51.092269
# datetime.utcfromtimestamp() 2017-05-07 15:32:51.092438

datetime类提供的实例方法与属性(很多在date和time中已出现过,在此有类似的意义). 下面是格式字符串详解:

dt = datetime.datetime.now()
print('(%Y-%m-%d %H:%M:%S %f): ' , dt.strftime( '%Y-%m-%d %H:%M:%S %f' ))
print('(%Y-%m-%d %H:%M:%S %p): ' , dt.strftime( '%y-%m-%d %I:%M:%S %p' ))
print('%%a: %s '  % dt.strftime( '%a' ))
print('%%A: %s '  % dt.strftime( '%A' ))
print('%%b: %s '  % dt.strftime( '%b' ))
print('%%B: %s '  % dt.strftime( '%B' ))
print('日期时间%%c: %s '  % dt.strftime( '%c' ))
print('日期%%x:%s '  % dt.strftime( '%x' ))
print('时间%%X:%s '  % dt.strftime( '%X' ))
print('今天是这周的第%s天 '  % dt.strftime( '%w' ))
print('今天是今年的第%s天 '  % dt.strftime( '%j' ))
print('今周是今年的第%s周 '  % dt.strftime( '%U' ))

# # ---  结果 ---
# (%Y-%m-%d %H:%M:%S %f):  2017-05-07 22:54:49 126127
# (%Y-%m-%d %H:%M:%S %p):  17-05-07 10:54:49 PM
# %a: Sun
# %A: Sunday
# %b: May
# %B: May
# 日期时间%c: Sun May  7 22:54:49 2017
# 日期%x:05/07/17
# 时间%X:22:54:49
# 今天是这周的第0天
# 今天是今年的第127天
# 今周是今年的第19周

发表评论