python datetime的使用

󰃭 2017-03-04

原创作品: 首发u3v3, 转载请保留

地址: https://www.u3v3.com/ar/1273

作者ID: Yi_Zhi_Yu

首发日期: 2017.3.4


乱七八糟的datetime

在PHP中, 时间转换非常简单, strtotimedate 两个函数就完事了, 但是在python 中,时间相关的包有好几个, 我常用的是datetime.

但这个包我至今还是对datetime 这个包的使用非常疑惑, 每次都要再专门查一下, 今天就来初步撸撸这个包

datetime 模块

datetime 是一个比较大的包, 这个包下面又有几个小模块, 以下分别介绍

datetime.date 模块

这个模块通过名字可以看出, 是对精确到天的日期的处理,

  • 构造一个 date 的对象如下:
d = datetime.date(year=2016, month=9, day=3)

这就是一个日期格式的对象

还有是通过获取的方式构造的日期格式

d = datetime.date.today() # 获取当天日期
d = datetime.date.fromtimestamp(1499998880) # 通过 时间戳 获取日期

这里没有直接通过字符串生成日期对象的方式, 也没有日期对象直接转换时间戳的方式

  • 常用属性方法

既然我们已经得到了一个 date 的对象, 我们需要的属性该怎么使用呢,

以下是常用的日期对象属性总结

d.year 	# 2016 日期所在年份
d.month # 9   日期所在月份
d.day 	# 3 日期月份中的天

还有一些函数使用

d.strftime('%Y/%m/%d')	# 2016/09/03 格式化输出
d.replace(year=2017)	# datetime.date(2017, 9, 3) 替换对象中的年份(月/日也可以替换)
d.weekday()				# 5 Monday == 0 ... Sunday == 6 一周中第几天,注意这里是从周一,第0天开始计算的,所以这里d是在周六
d.isoweekday()			# 6 Monday == 1 ... Sunday == 7 一周中的第几天,这个是我们常见的iso标准, 这里即表示周六

datetime.time 模块

这个模块是对 时/分/秒/毫秒 的时间处理模块

  • 构造一个time对象
t = datetime.time(hour=13, minute=3, second=12)

注意这里并没有其他直接构造 time 对象的方式了

  • 常用属性和方法

以下常用属性

t.hour		# 13 所在的小时 24小时制
t.minute 	# 9 所在的分钟 
t.second 	# 12 所在的秒
t.microsecond # 0 所在的毫秒

以下是常用函数

t.strftime('%H:%M:%S') # '13:03:12' 格式化输出
t.replace(hour=9) # datetime.time(9, 3, 12) 替换时分秒毫秒, 类比datetime.date.replace

datetime.datetime 模块

这个模块综合了 datetime.date 和 datetime.time 两个模块, 既有对日期的处理, 也同时包含了对时分秒级别的处理

  • 构造 datetime.datetime 对象

直接构造

dt = datetime.datetime(year=2016, month=9, day=3, hour=13, minute=43, second=12) # 这里年月日是必须的参数, 时分秒甚至微秒属于可选参数

也有一些获取的方式构造的方式


dt = datetime.datetime.today()  	# 获取当前时间的datetime对象
dt = datetime.datetime.now()		# 默认也是当前时区时间的datetime对象, 不过可以指定时区(这里暂不讨论)

dt = datetime.datetime.fromtimestamp(1423000000) # 通过时间戳获取, 这个很常用
dt = datetime.datetime.strptime('2016-12-11 13:32:32', '%Y-%m-%d %H:%M:%S') # 通过格式化的时间字符串和对应的格式说明, 构造的对象, 这个非常常用

注意, 这个上面就包含了通过字符串构造datetime.datetime对象的方式

  • 常用属性和方法

因为这个模块同时包含了对日期和时分秒的处理, 所以在datetime.datedatetime.time的常用属性和方法在datetime.datetime模块中都有

# 属性
dt.year
dt.month
dt.day
...
dt.microsecond

# 函数
dt.strftime('%Y-%m-%d %H:%M:%S')
dt.weekday()
dt.isoweekday()
...

这里也说一下 datetime.datetime 特有的常用方法

dt.timestamp() # 转换时间戳

这样, 我们就可以将时间字符串转换成时间戳相互转换了

时间字符串转换时间戳

两步走

# 时间字符串构造datetime.datetime对象
dt = datetime.datetime.strptime('2016-12-11 13:32:32', '%Y-%m-%d %H:%M:%S')
# datetime.datetime 对象转换时间戳
dt.timestamp()

时间戳转换为时间字符串

也是两步走

# 时间戳构造datetime.datetime 对象
dt = datetime.datetime.fromtimestamp(1423000000)
# datetime.datetime 对象格式化时间字符串
dt.strftime('%H:%M:%S %H:%M:%S')

现在, 我们已经把datetime这个包里面的三大模块撸了一遍, 当然, datetime包里还有几个模块, 比如 timezone(时区相关), timedelta(时间差相关)的模块也挺重要, 后面我会补充完整


写到这里, 我对datetime这个包也算有了一个初步但比较清晰的理解了, 不是那么糊涂了, 那你们看到这里时是不是也是呢, 如果有什么建议和疑问, 请在评论里提出来, 我会继续改进