Python 可以用多种方式处理日期和时间。在计算机中转换日期格式是一项常见的任务。Python 标准库中有几个模块用于处理与日期和时间相关的处理:
时间戳(Tick Intervals)
时间间隔是以秒为单位的浮点数。特定的时间瞬间可以用自 1970 年 1 月 1 日午夜以来的秒数来表达(纪元时间)。
Python 中有一个流行的时间模块 time
,提供了用于处理时间和在不同表示之间转换的函数。函数 time.time()
返回自 1970 年 1 月 1 日午夜以来的当前系统时间(以秒为单位)。
示例
import time
ticks = time.time()
print ("自 1970 年 1 月 1 日午夜以来的秒数:", ticks)
这将产生类似以下的结果:
自 1970 年 1 月 1 日午夜以来的秒数: 1681928297.5316436
日期算术使用时间戳很容易实现。但是,纪元之前的日期无法以这种方式表示。远未来的日期也无法这样表示——UNIX 和 Windows 的截止点是在 2038 年左右。
TimeTuple 是什么?
Python 的许多时间函数将时间处理为一个包含 9 个数字的元组,如下所示:
索引 |
字段 |
值 |
0 |
4位年份 |
2016 |
1 |
月份 |
1 到 12 |
2 |
天 |
1 到 31 |
3 |
小时 |
0 到 23 |
4 |
分钟 |
0 到 59 |
5 |
秒 |
0 到 61 (60 或 61 是闰秒) |
6 |
星期几 |
0 到 6 (0 表示星期一) |
7 |
一年中的第几天 |
1 到 366 (儒略日) |
8 |
夏令时 |
-1, 0, 1, -1 表示库确定夏令时 |
例如,
>>> import time
>>> print (time.localtime())
这将产生如下输出:
time.struct_time(tm_year=2023, tm_mon=4, tm_mday=19, tm_hour=23, tm_min=49, tm_sec=8, tm_wday=2, tm_yday=109, tm_isdst=0)
上面的元组等同于 struct_time
结构。此结构具有以下属性:
索引 |
属性 |
值 |
0 |
tm_year |
2016 |
1 |
tm_mon |
1 到 12 |
2 |
tm_mday |
1 到 31 |
3 |
tm_hour |
0 到 23 |
4 |
tm_min |
0 到 59 |
5 |
tm_sec |
0 到 61 (60 或 61 是闰秒) |
6 |
tm_wday |
0 到 6 (0 表示星期一) |
7 |
tm_yday |
1 到 366 (儒略日) |
8 |
tm_isdst |
-1, 0, 1, -1 表示库确定夏令时 |
获取当前时间
要将某一时间点从纪元以来的秒数浮点值转换为时间元组,可以将该浮点值传递给返回包含所有有效九项的时间元组的函数(例如,localtime
)。
import time
localtime = time.localtime(time.time())
print ("本地当前时间 :", localtime)
这将产生以下结果,可以以其他任何形式展示:
本地当前时间 : time.struct_time(tm_year=2023, tm_mon=4, tm_mday=19, tm_hour=23, tm_min=42, tm_sec=41, tm_wday=2, tm_yday=109, tm_isdst=0)
获取格式化的时间
您可以根据需求格式化任何时间,但获取易于阅读的时间格式的一个简单方法是使用 asctime()
方法。
import time
localtime = time.asctime( time.localtime(time.time()) )
print ("本地当前时间 :", localtime)
这将产生以下输出:
本地当前时间 : Wed Apr 19 23:45:27 2023
获取某个月的日历
calendar
模块提供了多种方法来处理年份和月份的日历。这里我们打印出给定月份(2023年4月)的日历。
import calendar
cal = calendar.month(2023, 4)
print ("这是日历:")
print (cal)
这将产生以下输出:
这是日历:
April 2023
Mo Tu We Th Fr Sa Su
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
time
模块
Python 中有一个流行的时间模块 time
,提供了用于处理时间和在不同表示之间转换的函数。以下列出了所有可用的方法:
序号 |
函数与描述 |
1 |
time.altzone |
2 |
time.asctime([tupletime]) |
3 |
time.clock() |
4 |
time.ctime([secs]) |
5 |
time.gmtime([secs]) |
6 |
time.localtime([secs]) |
7 |
time.mktime(tupletime) |
8 |
time.sleep(secs) |
9 |
time.strftime(fmt[,tupletime]) |
10 |
time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') |
11 |
time.time() |
12 |
time.tzset() |
让我们简要地了解一下这些函数。
time
模块中有两个重要的属性:
序号 |
属性与描述 |
1 |
time.timezone |
2 |
time.tzname |
calendar
模块
calendar
模块提供了与日历相关的函数,包括打印给定月份或年份的文本日历的功能。
默认情况下,calendar
将星期一作为一周的第一天,星期日作为最后一天。要更改这一点,请调用 calendar.setfirstweekday()
函数。
以下是 calendar
模块提供的函数列表:
序号 |
函数与描述 |
1 |
calendar.calendar(year,w=2,l=1,c=6) |
2 |
calendar.firstweekday() |
3 |
calendar.isleap(year) |
4 |
calendar.leapdays(y1,y2) |
5 |
calendar.month(year,month,w=2,l=1) |
6 |
calendar.monthcalendar(year,month) |
7 |
calendar.monthrange(year,month) |
8 |
calendar.prcal(year,w=2,l=1,c=6) |
9 |
calendar.prmonth(year,month,w=2,l=1) |
10 |
calendar.setfirstweekday(weekday) |
11 |
calendar.timegm(tupletime) |
12 |
calendar.weekday(year,month,day) |
datetime
模块
Python 的 datetime
模块包含在标准库中。它由帮助操作日期和时间数据以及执行日期时间算术的类组成。
datetime
类的对象要么是 “aware” 要么是 “naive”。如果对象包含时区信息,则为 “aware”,否则分类为 “naive”。date
类的对象是 “naive”,而 time
和 datetime
对象则是 “aware”。
Python date
对象
date
对象代表一个由年、月和日组成的日期。当前的格里高利历在两个方向上无限延伸。
语法
datetime.date(year, month, day)
参数必须是整数,在以下范围内:
-
year
: MINYEAR <= year <= MAXYEAR
-
-
day
: 1 <= day <= 给定月份和年份中的天数
如果提供的任何参数超出上述范围,则会引发 ValueError
。
Python 中的日期类 (date
) 和时间类 (time
) 示例
日期类 (date
) 示例
示例
from datetime import date
date1 = date(2023, 4, 19)
print("Date:", date1)
date2 = date(2023, 4, 31)
它将产生以下输出:
Date: 2023-04-19
Traceback (most recent call last):
File "C:\Python311\hello.py", line 8, in <module>
date2 = date(2023, 4, 31)
ValueError: day is out of range for month
日期类 (date
) 的属性
-
date.min
— 最早可表示的日期,date(MINYEAR, 1, 1)
。
-
date.max
— 最晚可表示的日期,date(MAXYEAR, 12, 31)
。
-
date.resolution
— 非等日期对象之间的最小可能差异。
-
date.year
— 在 MINYEAR
和 MAXYEAR
之间(包括边界)。
-
date.month
— 在 1
和 12
之间(包括边界)。
-
date.day
— 在 1
和给定年份中的给定月份的天数之间。
示例
from datetime import date
mindate = date.min
print("Minimum Date:", mindate)
maxdate = date.max
print("Maximum Date:", maxdate)
Date1 = date(2023, 4, 20)
print("Year:", Date1.year)
print("Month:", Date1.month)
print("Day:", Date1.day)
它将产生以下输出:
Minimum Date: 0001-01-01
Maximum Date: 9999-12-31
Year: 2023
Month: 4
Day: 20
日期类 (date
) 中的类方法
-
-
fromtimestamp(timestamp)
— 返回对应于 time.time()
返回的 POSIX 时间戳的本地日期。
-
fromordinal(ordinal)
— 返回对应于前格里高利序数的日期,其中公元1年的1月1日有序数1。
-
fromisoformat(date_string)
— 返回对应于以任何有效的 ISO 8601 格式给出的 date_string
的日期,除了序数日期。
示例
from datetime import date
print(date.today())
d1 = date.fromisoformat('2023-04-20')
print(d1)
d2 = date.fromisoformat('20230420')
print(d2)
d3 = date.fromisoformat('2023-W16-4')
print(d3)
它将产生以下输出:
2023-04-20
2023-04-20
2023-04-20
2023-04-20
日期类 (date
) 中的实例方法
-
replace()
— 通过指定关键字参数的新值返回一个日期。
-
timetuple()
— 返回一个 time.struct_time
,如 time.localtime()
返回的。
-
toordinal()
— 返回日期的前格里高利序数,其中公元1年的1月1日有序数1。对于任何日期对象 d
,date.fromordinal(d.toordinal()) == d
。
-
weekday()
— 返回一周中的天数作为一个整数,其中星期一是0,星期日是6。
-
isoweekday()
— 返回一周中的天数作为一个整数,其中星期一是1,星期日是7。
-
isocalendar()
— 返回一个包含三个组件的命名元组对象:年、周和周内的一天。
-
isoformat()
— 返回一个表示日期的字符串,格式为 YYYY-MM-DD
。
-
__str__()
— 对于一个日期 d
,str(d)
等价于 d.isoformat()
。
-
-
strftime(format)
— 返回一个由显式格式字符串控制的表示日期的字符串。
-
__format__(format)
— 同 date.strftime()
。
示例
from datetime import date
d = date.fromordinal(738630)
print(d)
print(d.timetuple())
print(d.isoformat())
print(d.strftime("%d/%m/%y"))
print(d.strftime("%A %d. %B %Y"))
print(d.ctime())
print('The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month"))
t = d.timetuple()
for i in t:
print(i)
ic = d.isocalendar()
for i in ic:
print(i)
print(d.replace(month=5))
它将产生以下输出:
2023-04-20
time.struct_time(tm_year=2023, tm_mon=4, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=110, tm_isdst=-1)
2023-04-20
20/04/23
Thursday 20. April 2023
Thu Apr 20 00:00:00 2023
The day is 20, the month is April.
2023
4
20
0
0
0
3
110
-1
2023
16
4
2023-05-20
Python time
模块
time
类的对象代表一天中的本地时间。它独立于任何特定的一天。如果对象包含 tzinfo
详情,则它是 aware
对象。如果 tzinfo
是 None
,则 time
对象是 naive
对象。
语法
datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
所有参数都是可选的。tzinfo
可能是 None
,或者是一个 tzinfo
子类的实例。其余参数必须是在以下范围内的整数:
-
-
minute
— 0 <= minute < 60
-
second
— 0 <= second < 60
-
microsecond
— 0 <= microsecond < 1000000
如果提供的任何参数不在上述范围内,则会引发 ValueError
。
示例
from datetime import time
time1 = time(8, 14, 36)
print("Time:", time1)
time2 = time(minute = 12)
print("time", time2)
time3 = time()
print("time", time3)
time4 = time(hour = 26)
它将产生以下输出:
Time: 08:14:36
time 00:12:00
time 00:00:00
Traceback (most recent call last):
File "/home/cg/root/64b912f27faef/main.py", line 12, in <module>
time4 = time(hour = 26)
ValueError: hour must be in 0..23
time
类的类属性
-
time.min
— 最早可表示的时间,time(0, 0, 0, 0)
。
-
time.max
— 最晚可表示的时间,time(23, 59, 59, 999999)
。
-
time.resolution
— 非等时间对象之间的最小可能差异。
示例
from datetime import time
print(time.min)
print(time.max)
print(time.resolution)
它将产生以下输出:
00:00:00
23:59:59.999999
0:00:00.000001
time
类的实例属性
-
time.hour
— 在 range(24)
内。
-
time.minute
— 在 range(60)
内。
-
time.second
— 在 range(60)
内。
-
time.microsecond
— 在 range(1000000)
内。
-
time.tzinfo
— 构造 time
对象时的 tzinfo
参数,或者 None
。
示例
from datetime import time
t = time(8,23,45,5000)
print(t.hour)
print(t.minute)
print(t.second)
print(t.microsecond)
它将产生以下输出:
8
23
455000
Python 中的日期类 (date
) 和时间类 (time
) 示例
时间类 (time
) 的实例方法
replace()
方法
-
返回具有相同值的时间,除非那些由指定的关键字参数赋予新值的属性。
isoformat()
方法
-
返回一个表示时间的字符串,格式遵循 ISO 8601。
__str__()
方法
-
对于一个时间
t
,str(t)
等同于 t.isoformat()
。
strftime(format)
方法
-
返回一个表示时间的字符串,受显式格式字符串的控制。
__format__(format)
方法
utcoffset()
方法
-
如果
tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.utcoffset(None)
。
dst()
方法
-
如果
tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.dst(None)
。
tzname()
方法
-
如果
tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.tzname(None)
或者抛出异常。
Python datetime
对象
datetime
类的对象包含了日期和时间的信息。它假定了当前的格里高利历向两个方向延伸;像 time
对象一样,在每一天中正好有 3600*24
秒。
语法
datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
year
, month
和 day
参数是必需的。
-
year
— MINYEAR <= year <= MAXYEAR
-
-
day
— 1 <= day <=
给定月份和年份中的天数
-
-
minute
— 0 <= minute < 60
-
second
— 0 <= second < 60
-
microsecond
— 0 <= microsecond < 1000000
-
如果提供了一个超出上述范围的参数,则会引发 ValueError
。
示例
from datetime import datetime
dt = datetime(2023, 4, 20)
print(dt)
dt = datetime(2023, 4, 20, 11, 6, 32, 5000)
print(dt)
它将产生以下输出:
2023-04-20 00:00:00
2023-04-20 11:06:32.005000
datetime
类的类属性
-
datetime.min
— 最早可表示的 datetime
,datetime(MINYEAR, 1, 1, tzinfo=None)
。
-
datetime.max
— 最晚可表示的 datetime
,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
。
-
datetime.resolution
— 非等 datetime
对象之间的最小可能差异,timedelta(microseconds=1)
。
示例
from datetime import datetime
min = datetime.min
print("Min DateTime ", min)
max = datetime.max
print("Max DateTime ", max)
它将产生以下输出:
Min DateTime 0001-01-01 00:00:00
Max DateTime 9999-12-31 23:59:59.999999
datetime
对象的实例属性
-
datetime.year
— 在 MINYEAR
和 MAXYEAR
之间(包括边界)。
-
datetime.month
— 在 1
和 12
之间(包括边界)。
-
datetime.day
— 在 1
和给定年份中的给定月份的天数之间。
-
datetime.hour
— 在 range(24)
内。
-
datetime.minute
— 在 range(60)
内。
-
datetime.second
— 在 range(60)
内。
-
datetime.microsecond
— 在 range(1000000)
内。
-
datetime.tzinfo
— 作为 datetime
构造函数的 tzinfo
参数传递的对象,或者如果没有传递则为 None
。
-
datetime.fold
— 在 [0, 1]
范围内。用于在重复区间内消除壁钟时间的歧义。
示例
from datetime import datetime
dt = datetime.now()
print("Day: ", dt.day)
print("Month: ", dt.month)
print("Year: ", dt.year)
print("Hour: ", dt.hour)
print("Minute: ", dt.minute)
print("Second: ", dt.second)
它将产生以下输出:
Day: 20
Month: 4
Year: 2023
Hour: 15
Minute: 5
Second: 52
datetime
对象的类方法
-
today()
— 返回当前本地日期时间,tzinfo
为 None
。
-
now(tz=None)
— 返回当前本地日期和时间。
-
utcnow()
— 返回当前的 UTC 日期和时间,tzinfo
为 None
。
-
utcfromtimestamp(timestamp)
— 返回对应于 POSIX 时间戳的 UTC 日期时间,tzinfo
为 None
。
-
fromtimestamp(timestamp, timezone.utc)
— 在符合 POSIX 规范的平台上,这等同于 datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
。
-
fromordinal(ordinal)
— 返回对应于前格里高利序数的日期时间,其中公元1年的1月1日有序数1。
-
fromisoformat(date_string)
— 返回对应于以任何有效的 ISO 8601 格式给出的 date_string
的日期时间。
datetime
对象的实例方法
-
date()
— 返回具有相同年、月和日的日期对象。
-
time()
— 返回具有相同小时、分钟、秒、微秒和折叠状态的 time
对象。
-
timetz()
— 返回具有相同小时、分钟、秒、微秒、折叠状态和 tzinfo
属性的 time
对象。参见 time()
方法。
-
replace()
— 返回具有相同属性的 datetime
,除非那些由指定的关键字参数赋予新值的属性。
-
astimezone(tz=None)
— 返回具有新的 tzinfo
属性 tz
的 datetime
对象。
-
utcoffset()
— 如果 tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.utcoffset(self)
。
-
dst()
— 如果 tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.dst(self)
。
-
tzname()
— 如果 tzinfo
是 None
,返回 None
,否则返回 self.tzinfo.tzname(self)
。
-
timetuple()
— 返回一个 time.struct_time
,如 time.localtime()
返回的。
-
datetime.toordinal()
— 返回日期的前格里高利序数。
-
timestamp()
— 返回对应于 datetime
实例的 POSIX 时间戳。
-
isoweekday()
— 返回一周中的天数作为一个整数,其中星期一是 1,星期日是 7。
-
isocalendar()
— 返回一个包含三个组件的命名元组对象:年、周和周内的一天。
-
isoformat(sep='T', timespec='auto')
— 返回一个表示日期和时间的字符串,格式为 ISO 8601。
-
__str__()
— 对于一个 datetime
实例 d
,str(d)
等同于 d.isoformat(' ')
。
-
ctime()
— 返回一个表示日期和时间的字符串。
-
strftime(format)
— 返回一个表示日期和时间的字符串,受显式格式字符串的控制。
-
__format__(format)
— 同 strftime()
。
示例
from datetime import datetime, date, time, timezone
d = date(2022, 4, 20)
t = time(12, 30)
datetime.combine(d, t)
d = datetime.now()
print(d)
dt = datetime.strptime("23/04/20 16:30", "%d/%m/%y %H:%M")
tt = dt.timetuple()
for it in tt:
print(it)
ic = dt.isocalendar()
for it in ic:
print(it)
它将产生以下输出:
2023-04-20 15:12:49.816343
2020
4
23
16
30
0
3
114
-1
2020
17
4
Python timedelta
对象
timedelta
对象表示两个日期或两个时间对象之间的持续时间。
语法
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
内部存储的属性为天数、秒和微秒。其他参数转换为这些单位:
天数、秒和微秒随后被规范化,以便表示唯一。
示例
下面的例子展示了 Python 内部只存储天数、秒和微秒。
from datetime import timedelta
delta = timedelta(
days=100,
seconds=27,
microseconds=10,
milliseconds=29000,
minutes=5,
hours=12,
weeks=2
)
print(delta)
它将产生以下输出:
114 days, 12:05:56.000010
示例
下面的例子展示了如何将 timedelta
对象添加到 datetime
对象上。
from datetime import datetime, timedelta
date1 = datetime.now()
date2= date1+timedelta(days = 4)
print("Date after 4 days:", date2)
date3 = date1-timedelta(15)
print("Date before 15 days:", date3)
它将产生以下输出:
Date after 4 days: 2023-04-24 18:05:39.509905
Date before 15 days: 2023-04-05 18:05:39.509905
timedelta
对象的类属性
-
timedelta.min
— 最负的 timedelta
对象,timedelta(-999999999)
。
-
timedelta.max
— 最正的 timedelta
对象,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
。
-
timedelta.resolution
— 非等 timedelta
对象之间的最小可能差异,timedelta(microseconds=1)
。
示例
from datetime import timedelta
min = timedelta.min
print("Minimum value:", min)
max = timedelta.max
print("Maximum value", max)
它将产生以下输出:
Minimum value: -999999999 days, 0:00:00
Maximum value 999999999 days, 23:59:59.999999
timedelta
对象的实例属性
由于内部只存储了天数、秒和微秒,因此这些是 timedelta
对象的唯一实例属性。
-
days
— 在 -999999999
和 999999999
之间(包括边界)。
-
seconds
— 在 0
和 86399
之间(包括边界)。
-
microseconds
— 在 0
和 999999
之间(包括边界)。
timedelta
对象的实例方法
-
timedelta.total_seconds()
— 返回持续时间中的总秒数。
示例
from datetime import timedelta
year = timedelta(days=365)
years = 5 * year
print(years)
print(years.days // 365)
646
year_1 = years // 5
print(year_1.days)
它将产生以下输出:
1825 days, 0:00:00
5
365