Python 的标准库 datetime 可以用来处理日期和时间 (date, times and times)。方法strftime()和strptime()将日期和时间转换为字符串或从字符串转换,可以用来处理各种格式的日期和时间。
它还可以进行减法和加法等运算。例如,你可以轻松计算并获得10天前或3周后的日期,或50分钟后的时间。
首先,我们将描述日期时间模块中可用的以下几类对象。
datetime.datetime
:日期和时间(日期和时间)datetime.date
:日期datetime.time
:时间datetime.timedelta
:时间差和经过的时间
还解释了strftime()和strptime()方法,它们将date/time和字符串相互转换。
datetime
对象datetime.now()
:今天的日期,当前的时间datetime
对象构造器- 将一个日期时间对象转换为一个日期对象
date
对象date.today()
:今天的日期- 日期对象的构造函数
time
对象- 时间对象的构造函数
timedelta
对象- 减去datetime和date对象来创建timedelta对象。
- 计时器对象的构造函数
- 使用timedelta对象的减法和加法
strftime()
:从日期和时间转换为字符串strptime()
:从字符串到日期和时间的转换
标准库中还包括日历模块,它可以生成纯文本或HTML格式的日历。
数据时间对象
datetime对象是一个同时具有日期(年、月、日)和时间(时、分、秒、微秒)信息的对象。你可以通过以下属性访问这些信息。
year
month
day
hour
minute
second
microsecond
datetime.now(): 今天的日期,当前的时间
datetime.now()将给你一个包含今天的日期(当前日期)和当前时间的datetime对象。
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
日期时间对象的构造函数
它也可以为任意的日期和时间生成日期时间对象。
datetime对象的构造函数如下。
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
以下数值是必须的,其他数值可以省略。如果省略,默认值为0。
year
month
day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
将一个日期时间对象转换为一个日期对象
一个日期时间对象可以通过date()方法转换为一个日期对象,如下所述。
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
日期对象
日期对象是一个包含日期(年、月、日)信息的对象。它可以通过年、月、日这些属性来访问。
date.today(): 今天的日期
当前日期(今天的日期)的日期对象可以通过date.day()获得。
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
日期对象的构造函数
日期对象的构造函数如下
date(year, month, day)
都是必须的,不能省略。
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
时间对象
时间对象是一个包含时间信息的对象(小时、分钟、秒和微秒)。它可以使用属性小时、分钟、秒和微秒来访问。
时间对象的构造函数
时间对象的构造函数如下。
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
所有这些都是可选的,如果它们被省略,则被设置为0。
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
时间轴对象
timedelta对象是一个代表两个日期和时间之间的时间差的对象,或者是经过的时间。它的信息单位是天、秒和微秒,可以通过属性天、秒和微秒来访问。也可以用total_seconds()方法获得总秒数。
减去datetime和date对象,创建timedelta对象。
将日期时间对象相互减去,得到一个timedelta对象。
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
将日期对象相互减去,同样可以得到一个timedelta对象。
计时器对象的构造函数
Timedelta对象的构造函数如下
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有这些都是可选的,如果它们被省略,则被设置为0。
注意,timedelta对象只持有以下信息。
- 数日:
days
- 秒数:
seconds
- 微秒计数:
microseconds
例如,以下两个是相等的
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
使用timedelta对象的减法和加法
timedelta对象可以与datetime和date对象一起使用,以执行减法和加法等操作。例如,你可以很容易地计算并获得一周前或10天后的日期,或从现在开始的50分钟的时间。
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
它还可以用来计算离某个特定日期的天数。
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): 从日期和时间转换为字符串
datetime和date对象的strftime()方法可以用来将日期和时间(date and time)信息转换成任何格式的字符串。
格式化代码
有关可用的格式化代码,请参见下面的官方文件。
主要的格式化代码列举如下。
%d
:以十进制记数法表示的月份,并填入零。%m
:以十进制记数法表示的月份,并填入零。%y
:年的最后两位数字,以零点填充的十进制符号表示。%Y
:以十进制符号表示的年的四位数,并填入零。%H
:当用小数点符号表示,并填入零时(24小时符号)。%I
:当用小数点符号表示,并填入零时(12小时符号)。%M
:对于十进制记数法来说,零点被填充。%S
:以十进制符号表示的秒数,并填入零。%f
:微秒(6位数),十进制记数法,填充0。%A
:该地区一周的日期名称%a
:当地的日名(缩写形式)。%B
:当地月份名称%b
:当地的月份名称(缩写)。%j
:以十进制记数法表示的年月日,用零填充。%U
:年的周数,用十进制记数法,用零填充(一周从周日开始)。%W
:年的周数,用十进制记数法,用零填充(一周从星期一开始)。
以下是日和月名称的格式化代码,根据不同的地区设置,可以得到不同的字符串。
%A
%a
%B
%b
还有一种专门用于ISO 8601格式字符串的方法。
示例代码
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05
如果你想得到一个数字而不是一个字符串,只需用int()将其转换为一个整数。
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
与timedelta对象相结合,很容易创建,例如,任何格式的双周日期列表。
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10
使用列表理解的符号更聪明。
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
- 相关文章。使用Python的列表理解符号
strptime(): 从字符串到日期和时间的转换
datetime strptime()可以用来从一个日期或时间字符串创建一个日期时间对象。有必要指定与原始字符串对应的格式化字符串。
还有一个专门针对ISO 8601字符串的方法(Python 3.7或更高版本)。
示例代码
date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
通过对检索到的数据时间对象使用strftime()方法,你可以用不同于原始字符串的格式来表示日期和时间。
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
如果你把它转换为一个日期时间对象,你也可以对timedelta对象进行操作,因此,例如你可以用同样的格式生成一个10天前的日期字符串。
date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018-01-22