在Python中把日期和时间转换为字符串或从字符串转换为日期和时间 (strftime, strptime)

商业

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']

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
Copied title and URL