Python 日期和时间

Python 日期和时间

Python程序可以以几种方式处理日期和时间。在计算机中,转换日期格式是一种常见的任务。以下是Python标准库中处理日期和时间相关处理的模块:

  • DateTime模块

  • Time模块

  • Calendar模块

什么是Tick间隔

时间间隔是以秒为单位的浮点数。特定的时间瞬间以自1970年1月1日午夜12:00以来的秒数表示(时代)。

在Python中有一个流行的 time 模块,它提供了处理时间和转换表示之间的函数。函数 time.time() 返回自1970年1月1日午夜12:00以来的当前系统时间的tick数。

示例

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

日期计算使用ticks非常容易。然而,这种形式无法表示纪元之前的日期。未来的日期也无法以这种方式表示——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 ("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)

获取格式化的时间

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

import time

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

这将产生以下 输出

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

获取一个月的日历

日历模块提供了许多方法来操作年历和月历。在这里,我们打印出给定月份(2008年1月)的日历。

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

这将产生以下结果 输出

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

时间模块

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

序号 功能及说明
1 time.altzone 如果定义了本地DST时区,返回本地DST时区相对于UTC的偏移量(以秒为单位)。如果本地DST时区在UTC的东面(如西欧和英国),则为负数。只有在夏令时非零时才使用此功能。
2 time.asctime([tupletime]) 接受一个时间元组,返回一个可读的24个字符字符串,例如 ‘Tue Dec 11 18:07:14 2008’。
3 time.clock( ) 返回当前CPU时间,以浮点数形式表示,单位为秒。要衡量不同方法的计算成本,time.clock的值比time.time更有用。
4 time.ctime([secs]) 类似于 asctime(localtime(secs)),如果没有参数则类似于 asctime()
5 time.gmtime([secs]) 接受一个自纪元以来的秒数表示的时间瞬间,返回一个带有UTC时间的时间元组t。注意:t.tm_isdst始终为0
6 time.localtime([secs]) 接受一个自纪元以来的秒数表示的时间瞬间,返回一个带有本地时间的时间元组t(t.tm_isdst为0或1,取决于是否根据当地规则应用夏令时于时间瞬间secs)。
7 time.mktime(tupletime) 接受一个以本地时间表达的时间元组,返回一个以自纪元以来的秒数表示的浮点数。
8 time.sleep(secs) 暂停调用线程secs秒。
9 time.strftime(fmt[,tupletime]) 接受一个以本地时间表达的时间元组,并根据字符串fmt的指定返回表示该时间的字符串。
10 time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’) 根据格式字符串fmt解析str,并以时间元组的格式返回该时间瞬间。
11 time.time( ) 返回当前时间瞬间,以浮点数形式表示,单位为秒。
12 time.tzset() 重置库函数使用的时间转换规则。环境变量TZ指定如何进行重置。

让我们简要介绍一下这些函数。

time模块提供了两个重要的属性,它们是:

编号 属性及其描述
1 time.timezone 属性time.timezone是本地时区(无夏令时)与UTC的偏移量(在美洲大于0,在大部分欧洲、亚洲、非洲小于等于0)的秒数。
2 time.tzname 属性time.tzname是一个依赖于语言环境的字符串对,分别是不含和含夏令时的本地时区名称。

日历模块

日历模块提供与日历相关的函数,包括打印给定月份或年份的文本日历的函数。

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

下面是 calendar 模块提供的函数列表:

序号 功能与描述
1 calendar.calendar(year,w=2,l=1,c=6) 返回一个用三列分隔而且每列中的日期由c个空格分隔的年份为year的多行字符串。w 是每个日期的字符宽度;每行的长度为21w+18+2c。l 是每周的行数。
2 calendar.firstweekday( ) 返回每周的起始日期设置的当前设置。默认情况下,当导入calendar时,这个值为0,表示星期一。
3 calendar.isleap(year) 如果year是闰年,则返回True;否则返回False。
4 calendar.leapdays(y1,y2) 返回范围(y1,y2)内年份中的闰天的总数。
5 calendar.month(year,month,w=2,l=1) 返回一个多行字符串,该字符串是年份year的月份month的日历,每周一行加上两行标题。w是每个日期的字符宽度;每行的长度为7*w+6。l是每周的行数。
6 calendar.monthcalendar(year,month) 返回一个由整数列表组成的列表。每个子列表表示一周。超出年份year的月份month的日子设置为0;月份内的日子设置为它们的月份第一天和以后的天数。
7 calendar.monthrange(year,month) 返回两个整数。第一个整数是年份year月份month的第一天的星期几代码;第二个整数是该月的天数。星期几代码0(星期一)到6(星期日);月份编号为1到12。 | 8 | calendar.prcal(year, w=2, l=1, c=6) 与print calendar.calendar(year, w, l, c)相似。
9 calendar.prmonth(year, month, w=2, l=1) 与print calendar.month(year, month, w, l)相似。
10 calendar.setfirstweekday(weekday) 将每周的第一天设置为星期代码weekday。星期代码为0(星期一)到6(星期日)。
11 calendar.timegm(tupletime) 与time.gmtime的反函数:接受以时间元组形式表示的时间瞬间,并将同一瞬间转换为自纪元以来的浮点秒数。
12 calendar.weekday(year, month, day) 返回给定日期的星期代码。星期代码为0(星期一)到6(星期日);月份编号为1(一月)到12(十二月)。

日期时间模块

Python的日期时间模块包含在标准库中。它包含用于操作日期时间数据和执行日期时间运算的类。

日期时间类的对象可以是有意识的(aware)或者天真的(naïve)。如果对象包含时区信息,则为有意识的;否则为天真的。日期类的对象是天真的,而时间和日期时间对象是有意识的。

日期

日期对象表示带有年、月和日的日期。当前的公历可以无限期地向两个方向延伸。

语法

datetime.date(year, month, day)

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

  • year − MINYEAR ≤ 年份 ≤ MAXYEAR

  • month − 1 ≤ 月份 ≤ 12

  • day − 1 ≤ day≤ 给定的月份和年份的天数

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

示例

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.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

# 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)

它将产生以下输出

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

日期类中的类方法

  • today() − 返回当前本地日期。

  • fromtimestamp(timestamp) − 返回对应于POSIX时间戳的本地日期,例如time.time()返回的时间戳。

  • 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

日期类中的实例方法

  • 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() - 返回表示日期的字符串,格式为ISO 8601,即YYYY-MM-DD。

  • __str__() - 对于一个日期d,str(d)等同于d.isoformat()。

  • ctime() - 返回表示日期的字符串。

  • strftime(format) - 返回一个表示日期的字符串,由显示格式字符串控制。

  • __format__(format) - 等同于date.strftime()。

示例

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))

它将产生以下输出 输出

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

时间

一个时间对象代表一天中的本地时间。它不依赖于任何特定的日期。如果对象包含tzinfo详细信息,则它是有意识的对象。如果为None,则时间对象是无意识的对象。

语法

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

所有的参数都是可选的。tzinfo可以是None,也可以是一个tzinfo子类的实例。其余的参数必须是以下范围内的整数 −

  • hour − 0 <= hour < 24,

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

类属性

  • 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)

会产生以下输出 output

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

实例属性

  • time.hour − 在范围(24)内

  • time.minute − 在范围(60)内

  • time.second − 在范围(60)内

  • time.microsecond − 在范围(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

实例方法

  • replace() − 返回一个具有相同值的时间,除非被指定的关键字参数给定了新值。

  • isoformat() − 以ISO 8601格式返回时间的字符串表示

  • __str__() − 对于时间t,str(t)等于t.isoformat()。

  • strftime(format) − 返回一个由显式格式字符串控制的时间的字符串表示。

  • __format__(format) − 同time.strftime()。

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

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

  • tzname() − 如果tzinfo为None,则返回None,否则返回self.tzinfo.tzname(None),或者引发异常。

日期时间

datetime类的一个对象包含日期和时间的信息。它假设当前的公历在两个方向上延伸;就像一个时间对象一样,每天有确切的3600*24秒。

语法

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

年、月和日参数是必需的。

  • year: MINYEAR <= 年 <= MAXYEAR,

  • month: 1 <= 月 <= 12,

  • day: 1 <= 日 <= 给定月份和年份的天数,

  • hour: 0 <= 小时 < 24,

  • minute: 0 <= 分钟 < 60,

  • second: 0 <= 秒 < 60,

  • microsecond: 0 <= 微秒 < 1000000,

  • fold: 取值范围为[0, 1]。

如果给定了超出范围的任何参数,则引发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.min - 可表示的最早时间,datetime(MINYEAR, 1, 1, tzinfo = None)。

  • datetime.max - 可表示的最晚时间,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.year - 在MINYEAR和MAXYEAR之间(包括边界)。

  • datetime.month - 在1到12之间(包括边界)。

  • datetime.day - 在给定年份给定月份的天数范围内(1到该月份的天数)。

  • datetime.hour - 在范围(24)内。

  • datetime.minute - 在范围(60)内。

  • datetime.second - 在范围(60)内。

  • datetime.microsecond - 在范围(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

类方法

  • today() - 返回当前本地日期和时间,时区信息为None。

  • now(tz=None) - 返回当前本地日期和时间。

  • utcnow() - 返回当前UTC日期和时间,时区信息为None。

  • utcfromtimestamp(timestamp) - 返回与POSIX时间戳相对应的UTC日期和时间,时区信息为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相对应的日期时间。

实例方法

  • date() − 返回具有相同年、月和日的日期对象。

  • time() − 返回具有相同小时、分钟、秒、毫秒和fold的时间对象。

  • timetz() − 返回具有相同小时、分钟、秒、毫秒、fold和tzinfo属性的时间对象。另请参见方法time()。

  • replace() − 返回具有相同属性的日期时间,除了通过指定的关键字参数给出新值的那些属性。

  • astimezone(tz=None) − 返回具有新的tzinfo属性tz的日期时间对象。

  • 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.localtime()的time.struct_time。

  • atetime.toordinal() − 返回日期的普利普特·格里高利历序数。

  • timestamp() − 返回与日期时间实例相对应的POSIX时间戳。

  • isoweekday() − 返回一个整数,表示一周的第几天,其中星期一为1,星期日为7。

  • isocalendar() − 返回一个命名元组,包含三个组件:年、周和工作日。

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

  • __str__() − 对于一个日期时间实例d,str(d)等同于d.isoformat(‘ ‘)。

  • ctime() − 返回表示日期和时间的字符串:

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

  • __format__(format) − 与strftime()相同。

示例

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)

它将产生以下输出: 输出

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

时间差

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

语法

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

在内部,属性以天、秒和微秒的形式存储。其他参数被转换为这些单位 –

  • 毫秒被转换为1000微秒。

  • 分钟被转换为60秒。

  • 小时被转换为3600秒。

  • 周被转换为7天。

而天、秒和微秒会被规范化,以确保表示方式是唯一的。

示例

下面的例子展示了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)

以下是其输出结果

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.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

# Getting minimum value
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对象的唯一实例属性。

  • days − 范围在-999999999至999999999之间(包括)

  • seconds − 范围在0至86399之间(包括)

  • microseconds − 范围在0至999999之间(包括)

实例方法

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程