Python 简明教程

Python - Date and Time

Python 程序可以使用多种方法处理日期和时间。在日期格式之间转换是计算机的常见任务。Python 标准库中的以下模块处理日期和时间相关的处理 −

  1. DateTime module

  2. Time module

  3. Calendar module

What are Tick Intervals

时间间隔是秒为单位的浮点数字。特定时间点以 1970 年 1 月 1 日上午 12:00(历元)以来的秒数表示。

Python 中有一个流行的 time 模块,它提供用于处理时间和在不同表示之间转换的函数。函数 time.time() 返回自 1970 年 1 月 1 日上午 12:00(历元)以来的当前系统时间(按刻度)。

Example

import time # This is required to include time module.
ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970:", ticks)

结果类似于以下内容:

Number of ticks since 12:00am, January 1, 1970: 1681928297.5316436

刻度可以轻松做日期计算。但是,无法以这种形式表示历元之前的日期。遥远未来的日期也不能以这种方式表示 - UNIX 和 Windows 的截止时间是 2038 年的某个时间。

What is TimeTuple?

Python 的许多时间函数将时间作为 9 个数字的元组进行处理,如下所示:

For example,

>>>import time
>>> print (time.localtime())

这将产生一个 output ,如下所示:

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 结构。此结构具有以下属性:

Getting the Current Time

要将自历元起的 seconds 浮点值的时间点转换为时间元组,将浮点值传递给返回包含所有 9 个有效项的时间元组的函数(例如,localtime)。

import time
localtime = time.localtime(time.time())
print ("Local current time :", localtime)

这将产生以下结果,该结果可以用任何其他可表示形式进行格式化:

Local current time : 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)

Getting the Formatted Time

您可以根据需要对任何时间进行格式化,但以可读格式获取时间的简单方法是 asctime()

import time

localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)

这将产生以下 output

Local current time : Wed Apr 19 23:45:27 2023

Getting the Calendar for a Month

日历模块提供了多种方法来使用年历和月历。这里,我们为给定的月份(2008 年 1 月)打印日历。

import calendar
cal = calendar.month(2023, 4)
print ("Here is the calendar:")
print (cal)

这将产生以下 output

Here is the calendar:
     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

The time Module

Python 中有一个流行的 time 模块,它提供用于处理时间和在不同表示之间转换的函数。以下是所有可用方法的列表。

让我们简单浏览一下这些函数。

时间模块提供两个重要的属性。它们是:

The calendar Module

日历模块提供与日历相关的一些功能,包括打印给定月份或年份文字日历的功能。

默认情况下,日历将星期一作为一周的第一天,将星期日作为最后一天。要更改此设置,请调用 calendar.setfirstweekday() 函数。

以下列出了 calendar 模块提供的函数:

Python datetime Module

Python 的 datetime 模块包含在标准库中。它包含用于帮助处理数据和时间数据以及执行日期时间运算的类。

datetime 类的对象要么是感知时间的,要么是幼稚的。如果对象包含时区信息,则它是感知时间的;否则,它被归类为幼稚的。date 类的对象是幼稚的,而 time 和 datetime 对象是感知时间的。

Python date Object

日期对象用年、月和日表示日期。当前的格里高利历在两个方向上无限延伸。

Syntax

datetime.date(year, month, day)

参数必须是整数,在以下范围内:

  1. year − MINYEAR ⇐ year ⇐ MAXYEAR

  2. month − 1 ⇐ month ⇐ 12

  3. day − 1 ⇐ day ⇐ 给定月份和年份中天数

如果给出了超出这些范围的任何参数的值,则会引发 ValueError。

Example

from datetime import date
date1 = date(2023, 4, 19)
print("Date:", date1)
date2 = date(2023, 4, 31)

它将生成以下 output

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 class attributes

  1. date.min − 最早的可以表示的日期,日期(MINYEAR、1、1)。

  2. date.max − 最迟的可以表示的日期,日期(MAXYEAR、12、31)。

  3. date.resolution − 非相等日期对象之间最小的可能差异。

  4. date.year − 包括在 MINYEAR 和 MAXYEAR 之间。

  5. date.month − 包括在 1 和 12 之间。

  6. date.day − 在给定年份的给定月份的 1 和天数之间。

Example

from datetime import date

# Getting min date
mindate = date.min
print("Minimum Date:", mindate)

# Getting max date
maxdate = date.max
print("Maximum Date:", maxdate)

Date1 = date(2023, 4, 20)
print("Year:", Date1.year)
print("Month:", Date1.month)
print("Day:", Date1.day)

它将生成以下 output

Minimum Date: 0001-01-01
Maximum Date: 9999-12-31
Year: 2023
Month: 4
Day: 20

Class Methods in Date Class

  1. today() − 返回当前的本地日期。

  2. fromtimestamp(timestamp) − 返回与 POSIX 时间戳(如 time.time() 返回的时间戳)相对应的本地日期。

  3. fromordinal(ordinal) − 返回与前格里高利历序数相对应的日期,其中 1 年的 1 月 1 日的序数为 1。

  4. fromisoformat(date_string) − 返回与 date_string 对应的日期,该字符串以任何有效的 ISO 8601 格式给出,但序数日期除外。

Example

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)

它将生成以下 output

2023-04-20
2023-04-20
2023-04-20
2023-04-20

Instance Methods in Date Class

  1. replace() − 通过使用关键字参数指定的新值替换指定属性,返回一个日期。

  2. timetuple() − 返回一个 time.struct_time,例如由 time.localtime() 返回的。

  3. toordinal() − 返回日期的前格里高利历序数,其中 1 年的 1 月 1 日的序数为 1。对于任何日期对象 d,date.fromordinal(d.toordinal()) == d。

  4. weekday() − 将星期几返回为一个整数,其中星期一为 0,星期日为 6。

  5. isoweekday() − 将星期几返回为一个整数,其中星期一为 1,星期日为 7。

  6. isocalendar() − 返回一个含三个分量的命名元组对象:年份、星期和工作日。

  7. isoformat() − 返回一个表示日期的字符串,采用 ISO 8601 格式,YYYY-MM-DD:

  8. str() − 对于日期 d,str(d) 等效于 d.isoformat()

  9. ctime() − 返回一个表示日期的字符串:

  10. strftime(format) − 返回一个表示日期的字符串,受显式格式字符串控制。

  11. format(format) − 与 date.strftime() 相同。

Example

from datetime import date
d = date.fromordinal(738630) # 738630th day after 1. 1. 0001
print (d)
print (d.timetuple())
# Methods related to formatting string output
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"))

# Methods for to extracting 'components' under different calendars
t = d.timetuple()
for i in t:
   print(i)

ic = d.isocalendar()
for i in ic:
   print(i)

# A date object is immutable; all operations produce a new object
print (d.replace(month=5))

它将生成以下 output

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 Module

一个对象 time 类表示这个一天中的本地时间。它独立于任何特定的一天。如果对象包含 tzinfo 详情,它就是一个有意识的对象。如果它为 None,则时间对象是一个天真的对象。

Syntax

datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

所有参数都是可选的。tzinfo 为 None,或为 tzinfo 子类的实例。剩余参数必须是在以下范围内的整数 −

  1. hour − 0 ⇐ 小时 < 24,

  2. minute − 0 ⇐ 分钟 < 60,

  3. second − 0 ⇐ 秒 < 60,

  4. microsecond − 0 ⇐ 微秒 < 1000000

如果任何参数超出这些范围,则引发 ValueError。

Example

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)

它将生成以下 output

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
    time4 = time(hour = 26)
ValueError: hour must be in 0..23

Class attributes

  1. time.min − 最早可表示的时间,time(0, 0, 0, 0)。

  2. time.max − 最新可表示的时间,time(23, 59, 59, 999999)。

  3. time.resolution − 不相等的时间对象之间的最小可能差。

Example

from datetime import time
print(time.min)
print(time.max)
print (time.resolution)

它将生成以下 output

00:00:00
23:59:59.999999
0:00:00.000001

Instance attributes

  1. time.hour − In range(24)

  2. time.minute − In range(60)

  3. time.second − In range(60)

  4. time.microsecond − In range(1000000)

  5. time.tzinfo − time 构造函数中的 tzinfo 参数,或为 None。

Example

from datetime import time
t = time(8,23,45,5000)
print(t.hour)
print(t.minute)
print (t.second)
print (t.microsecond)

它将生成以下 output

8
23
455000

Instance Methods of time Object

  1. replace() − 返回一个具有相同值的时间,除了对通过指定任何关键词参数设置的那些属性进行的新值。

  2. isoformat() − 返回表示 ISO 8601 格式时间的一个字符串

  3. str() − 对于时间 t,str(t) 等同于 t.isoformat()。

  4. strftime(format) − 返回表示通过一个明确格式字符串控制的时间的一个字符串。

  5. format(format) − 同于 time.strftime()。

  6. utcoffset() − 如果 tzinfo 为无,则返回无,否则返回 self.tzinfo.utcoffset(None),

  7. dst() − 如果 tzinfo 为无,则返回无,否则返回 self.tzinfo.dst(None),

  8. tzname() − 如果 tzinfo 为无,则返回无,否则返回 self.tzinfo.tzname(None),或引发一个异常

Python datetime object

datetime 类的一个对象包含着日期和时间的全部信息。它假设当前的公历在两个方向上延伸,就像一个 time 对象,并且每天精确包含 3600*24 秒。

Syntax

datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

year、month 和 day 参数是必需的。

  1. year − MINYEAR ⇐ year ⇐ MAXYEAR,

  2. month − 1 ⇐ month ⇐ 12,

  3. day − 1 ⇐ day ⇐ 给定月中和年中的天数,

  4. hour − 0 ⇐ 小时 < 24,

  5. minute − 0 ⇐ 分钟 < 60,

  6. second −0 ⇐ second < 60,

  7. microsecond − 0 ⇐ microsecond < 1000000,

  8. fold − 在 [0, 1] 中。

如果给出了任何超出范围的参数,则引发 ValueError。

Example

from datetime import datetime
dt = datetime(2023, 4, 20)
print(dt)

dt = datetime(2023, 4, 20, 11, 6, 32, 5000)
print(dt)

它将生成以下 output

2023-04-20 00:00:00
2023-04-20 11:06:32.005000

Class attributes

  1. datetime.min − 能够表示的最早 datetime:datetime(MINYEAR, 1, 1, tzinfo=None)。

  2. datetime.max − 能够表示的最晚 datetime:datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)。

  3. datetime.resolution − 非相等 datetime 对象之间最小的可能差, timedelta(microseconds=1)。

Example

from datetime import datetime
min = datetime.min
print("Min DateTime ", min)

max = datetime.max
print("Max DateTime ", max)

它将生成以下 output

Min DateTime 0001-01-01 00:00:00
Max DateTime 9999-12-31 23:59:59.999999

Instance Attributes of datetime Object

  1. datetime.year − 包括 MINYEAR 和 MAXYEAR。

  2. datetime.month − 1 到 12 包括 1 和 12。

  3. datetime.day − 1 到给定年份中给定月份的天数。

  4. datetime.hour − In range(24)

  5. datetime.minute − In range(60)

  6. datetime.second − In range(60)

  7. datetime.microsecond − In range(1000000).

  8. datetime.tzinfo − 传递给 datetime 构造函数的 tzinfo 参数作为对象,如果未传递参数,则为 None。

  9. datetime.fold − 在 [0, 1] 中。用于消除重复间隔期间不同本地时间的模糊性。

Example

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)

它将生成以下 output

Day: 20
Month: 4
Year: 2023
Hour: 15
Minute: 5
Second: 52

Class Methods of datetime Object

  1. today() − 返回当前本地 datetime tzinfo 为 None。

  2. now(tz=None) − 返回当前本地日期和时间。

  3. utcnow() − 返回当前 UTC 日期和时间,tzinfo 为 None。

  4. utcfromtimestamp(timestamp) − 返回与 POSIX 时间戳相对应的 UTC datetime,tzinfo 为 None。

  5. fromtimestamp(timestamp, timezone.utc) − 在 POSIX 合规平台上,它等于 datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)

  6. fromordinal(ordinal) − 返回与前儒略历序号对应的 datetime,其中 1 年 1 月 1 日的序数为 1。

  7. fromisoformat(date_string) − 返回与任何有效 ISO 8601 格式中的 date_string 对应的 datetime。

Instance Methods of datetime Object

  1. date() − 返回与相同的年、月和日的日期对象。

  2. time() − 返回与相同小时、分钟、秒、微秒和折叠的日期对象。

  3. timetz() − 返回与相同小时、分钟、秒、微秒、折叠和 tzinfo 属性的日期对象。请参阅方法时间()。

  4. replace() − 返回一个 datetime,其属性相同,不同之处在于指定的所有关键字参数都赋予这些属性新的值。

  5. astimezone(tz=None) − 返回一个具有新 tzinfo 属性 tz 的 datetime 对象。

  6. utcoffset() − 如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.utcoffset(self)

  7. dst() − 如果 tzinfo 为空,返回空;否则,返回 self.tzinfo.dst(self)

  8. tzname() − 如果 tzinfo 为空,返回空;否则,返回 self.tzinfo.tzname(self)

  9. timetuple() − 返回一个 time.struct_time,例如由 time.localtime() 返回的。

  10. atetime.toordinal() − 返回日期的前儒略历序数。

  11. timestamp() − 返回对应于 datetime 实例的 POSIX 时间戳。

  12. isoweekday() − 返回一周中的日期,作为一个整数,其中星期一为 1,星期天为 7。

  13. isocalendar() − 返回一个具有三个部分的已命名元组:年、周和星期几。

  14. isoformat(sep='T', timespec='auto') − 返回一个以 ISO 8601 格式表示日期和时间的字符串。

  15. str() − 对于 datetime 实例 d,str(d) 等同于 d.isoformat(' ')。

  16. ctime() − 返回一个字符串,用于表示日期和时间:

  17. strftime(format) − 返回一个字符串,用于表示日期和时间,由一个显式的格式字符串控制。

  18. format(format) − 与 strftime() 相同。

Example

from datetime import datetime, date, time, timezone

# Using datetime.combine()
d = date(2022, 4, 20)
t = time(12, 30)
datetime.combine(d, t)

# Using datetime.now()
d = datetime.now()
print (d)

# Using datetime.strptime()
dt = datetime.strptime("23/04/20 16:30", "%d/%m/%y %H:%M")

# Using datetime.timetuple() to get tuple of all attributes
tt = dt.timetuple()
for it in tt:
   print(it)

# Date in ISO format
ic = dt.isocalendar()
for it in ic:
   print(it)

它将生成以下 output

2023-04-20 15:12:49.816343
2020
4
23
16
30
0
3
114
-1
2020
17
4

Python timedelta Object

timedelta 对象表示两个日期或两个时间对象之间的持续时间。

Syntax

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

在内部,属性存储在日、秒和微秒中。其他参数被转换为这些单位 −

  1. 毫秒转换为 1000 微秒。

  2. 分钟转换为 60 秒。

  3. 小时转换为 3600 秒。

  4. 周转换为 7 天。

然后将天、秒和微秒标准化,以便表示唯一。

Example

以下示例显示了 Python 在内部仅存储日、秒和微秒。

from datetime import timedelta
delta = timedelta(
   days=100,
   seconds=27,
   microseconds=10,
   milliseconds=29000,
   minutes=5,
   hours=12,
   weeks=2
)
# Only days, seconds, and microseconds remain
print (delta)

它将生成以下 output

114 days, 12:05:56.000010

Example

以下例子展示了如何将 timedelta 对象添加到日期时间对象。

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)

它将生成以下 output

Date after 4 days: 2023-04-24 18:05:39.509905
Date before 15 days: 2023-04-05 18:05:39.509905

Class Attributes of timedelta Object

  1. timedelta.min - 最负的 timedelta 对象,timedelta(-999999999)。

  2. timedelta.max - 最正的 timedelta 对象 timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)。

  3. timedelta.resolution - 非相等 timedelta 对象之间可能存在的最小差值,timedelta(microseconds=1)

Example

from datetime import timedelta

# Getting minimum value
min = timedelta.min
print("Minimum value:", min)

max = timedelta.max
print("Maximum value", max)

它将生成以下 output

Minimum value: -999999999 days, 0:00:00
Maximum value 999999999 days, 23:59:59.999999

Instance Attributes of timedelta Object

由于 timedelta 对象在内部只存储日、秒和微秒,因此它们是 timedelta 对象的唯一实例属性。

  1. days - 介于-999999999和999999999之间(包含)。

  2. seconds - 介于 0 和 86399之间(包含)。

  3. microseconds - 介于 0 和 999999之间(包含)。

Instance Methods of timedelta Object

timedelta.total_seconds() - 返回持续时间中包含的总秒数。

Example

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)

它将生成以下 output

1825 days, 0:00:00
5
365