Python 日期和时间
Python程序可以以几种方式处理日期和时间。在计算机中,转换日期格式是一种常见的任务。以下是Python标准库中处理日期和时间相关处理的模块:
- DateTime模块
-
Time模块
-
Calendar模块
什么是Tick间隔
时间间隔是以秒为单位的浮点数。特定的时间瞬间以自1970年1月1日午夜12:00以来的秒数表示(时代)。
在Python中有一个流行的 time 模块,它提供了处理时间和转换表示之间的函数。函数 time.time() 返回自1970年1月1日午夜12:00以来的当前系统时间的tick数。
示例
这将会产生如下结果 –
日期计算使用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表示由库确定夏令时 |
例如,
这将产生以下输出-
上述元组等同于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),该函数将返回一个带有所有有效九个项的时间元组。
这将产生以下结果,可以以任何其他可呈现的形式进行格式化−
获取格式化的时间
可以根据需要对任何时间进行格式化,但是获取可读格式的时间的一种简单方法是 asctime() 方法。
这将产生以下 输出 –
获取一个月的日历
日历模块提供了许多方法来操作年历和月历。在这里,我们打印出给定月份(2008年1月)的日历。
这将产生以下结果 输出 –
时间模块
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)。如果对象包含时区信息,则为有意识的;否则为天真的。日期类的对象是天真的,而时间和日期时间对象是有意识的。
日期
日期对象表示带有年、月和日的日期。当前的公历可以无限期地向两个方向延伸。
语法
参数必须是整数,在以下范围内−
- year − MINYEAR ≤ 年份 ≤ MAXYEAR
-
month − 1 ≤ 月份 ≤ 12
-
day − 1 ≤ day≤ 给定的月份和年份的天数
如果给定的任何参数值超出这些范围,将引发ValueError。
示例
它将产生以下 输出 −
日期类属性
- 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到该月份的天数)。
示例
它将产生以下输出
日期类中的类方法
- today() − 返回当前本地日期。
-
fromtimestamp(timestamp) − 返回对应于POSIX时间戳的本地日期,例如time.time()返回的时间戳。
-
fromordinal(ordinal) − 返回对应于普遍公历纪元的日期,其中公元1年的1月1日具有序数1。
-
fromisoformat(date_string) − 返回对应于以任何有效的ISO 8601格式给出的date_string的日期,但不包括序数日期。
示例
这将产生以下 输出 −
日期类中的实例方法
- 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()。
示例
它将产生以下输出 输出 −
时间
一个时间对象代表一天中的本地时间。它不依赖于任何特定的日期。如果对象包含tzinfo详细信息,则它是有意识的对象。如果为None,则时间对象是无意识的对象。
语法
所有的参数都是可选的。tzinfo可以是None,也可以是一个tzinfo子类的实例。其余的参数必须是以下范围内的整数 −
- hour − 0 <= hour < 24,
-
minute − 0 <= minute < 60,
-
second − 0 <= second < 60,
-
microsecond − 0 <= microsecond < 1000000
如果给出的参数超出这些范围,将抛出ValueError异常。
示例
它将产生以下的 输出 −
类属性
- time.min - 表示的最早时间,time(0, 0, 0, 0)。
-
time.max - 表示的最晚时间,time(23, 59, 59, 999999)。
-
time.resolution - 非相等时间对象之间可能的最小差异。
示例
会产生以下输出 output −
实例属性
- time.hour − 在范围(24)内
-
time.minute − 在范围(60)内
-
time.second − 在范围(60)内
-
time.microsecond − 在范围(1000000)内
-
time.tzinfo − time构造函数的tzinfo参数,或者为None
示例
它将产生以下 输出 :
实例方法
- 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秒。
语法
年、月和日参数是必需的。
- year: MINYEAR <= 年 <= MAXYEAR,
-
month: 1 <= 月 <= 12,
-
day: 1 <= 日 <= 给定月份和年份的天数,
-
hour: 0 <= 小时 < 24,
-
minute: 0 <= 分钟 < 60,
-
second: 0 <= 秒 < 60,
-
microsecond: 0 <= 微秒 < 1000000,
-
fold: 取值范围为[0, 1]。
如果给定了超出范围的任何参数,则引发ValueError。
示例
将会产生以下输出
类属性
- 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)。
示例
它将产生以下 输出 -
实例属性
- 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]范围内。用于在重复间隔期间消除墙时的歧义。
示例
这将产生以下 输出 −
类方法
- 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()相同。
示例
它将产生以下输出: 输出 −
时间差
timedelta对象表示两个日期或两个时间对象之间的持续时间。
语法
在内部,属性以天、秒和微秒的形式存储。其他参数被转换为这些单位 –
- 毫秒被转换为1000微秒。
-
分钟被转换为60秒。
-
小时被转换为3600秒。
-
周被转换为7天。
而天、秒和微秒会被规范化,以确保表示方式是唯一的。
示例
下面的例子展示了Python内部只存储天、秒和微秒。
以下是其输出结果
示例
以下示例显示了如何将timedelta对象添加到datetime对象中。
它将产生以下输出−
类属性
- 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)。
示例
它将生成以下 输出 −
实例属性
由于只有天、秒和微秒是内部存储的,因此这些是timedelta对象的唯一实例属性。
- days − 范围在-999999999至999999999之间(包括)
-
seconds − 范围在0至86399之间(包括)
-
microseconds − 范围在0至999999之间(包括)
实例方法
timedelta.total_seconds() − 返回时间间隔中包含的总秒数。
示例
它将产生以下 输出 −