随心所欲地用Python处理时间(1&2)

来源:AI入门学习

作者:小伍哥

datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。

学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分。

日期:年月日,如 20210612

时间:时分秒,如 20:45:50

Python标准库中包含日期(date)和时间(time)的数据类型,还有日历方面的功能。要比较系统的学习该模块,需要了解下面的两个概念。

UTC(全球标准时间):是全球范围内计时的科学标准,它基于精心维护的原子钟,在全球范围内精确到微秒,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。作为全球最精确的时间系统,天文学家、航海家、“太空跟踪网”(DSN) 以及其他科学性学科都使用它,它的参考点是英国格林威治标准时间(GMT):地球本初子午线的午夜,也是 UTC 的午夜 (00:00:00.000000)。本地时间是根据地球上不同时区所处的位置调整 UTC 得来的,比如当美国加州的太平洋时间为正午 12:00:00 时,UTC 为 20:00:00。

夏令时(DST):表示为了节约能源, 人为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),又称"日光节约时制"和"夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。

感知型”和“简单型”对象:日期和时间对象可以根据它们是否包含时区信息而分为“感知型”和“简单型”两类。充分掌握应用性算法和政治性时间调整信息例如时区和夏令时的情况下,一个 感知型 对象就能相对于其他感知型对象来精确定位自身时间点。感知型对象是用来表示一个没有解释空间的固定时间点。简单型对象没有包含足够多的信息来无歧义地相对于其他 date/time 对象来定位自身时间点。

时间戳:Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)

import time 
time.time() 
1625483470.3409266

一、datetime模块概

Python内置的时间模块datetime包含下面的模块包含六个类和两个常数,提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求,且这些类型的对象都是不可变的。最常用的是datetime.datetime,有些人误以为就一个模块,其实是datetime模块下的datetime类。

常量、类或方法名

注解

datetime.date

一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。属性包含: year, month, day。

datetime.time

一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24*60*60 秒。这里没有“闰秒”的概念) 包含属性:hour、minute、second、microsecond 、tzinfo。

datetime.datetime

是日期和时间的结合,属性包含year、month、day、hour、minute、second、 microsecond、 tzinfo.表示日期时间

datetime.timedelta

表示两个 date 对象或者 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。

datetime.tzinfo

一个描述时区信息对象的抽象基类。用来给datetime和time类提供自定义的时间调整概念(例如处理时区和/或夏令时)。

datetime.timezone

一个实现了tzinfo抽象基类的子类,用于表示相对于世界标准时间(UTC)的偏移量。

datetime.MINYEAR

常量,表示年份允许的最小值为1

datetime.MAXYEAR

常量,表示年份允许的最大值为9999

书接上回,接着写

二、datetime.date类

1、date类介绍

作用:date类用来处理日期信息

语法:date类是datetime的内嵌类,实例化语法:datetime.date(year, month, day)

参数:year年份、month月份及day日期,所有参数都是必要的, 参数必须是在下面范围内的整数

MINYEAR <= year <= MAXYEAR

1 <= month <= 12

1 <= day<= 给定年月对应的天数

如果参数不在这些范围内,则抛出 ValueError 异常。

import datetime
t = datetime.date(2019,8,26)
print(type(t))
print(t.day,t.month,t.year) # 
26 8 2019

通过内置函数dir,可以查看date类的所有方法和属性

from datetime import date
print(dir(date))
['ctime', 'day', 'fromisocalendar', 'fromisoformat', 'fromordinal', 
'fromtimestamp', 'isocalendar', 'isoformat', 'isoweekday', 'max', 
'min', 'month', 'replace', 'resolution', 'strftime', 'timetuple', 
'today', 'toordinal', 'weekday', 'year']

2、类方法

date.today()

作用:返回当前的本地日期,等价于date.fromtimestamp(time.time())。

from datetime import date 
date.today()
datetime.date(2021, 7, 4)

date.fromtimestamp()

作用:返回对应于POSIX时间戳的当地时间,例如 time.time() 返回的就是时间戳。这可能引发 OverflowError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并且会在 localtime() 出错时引发 OSError。通常该数值会被限制在 1970 年至 2038 年之间。请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 fromtimestamp() 所忽略。

在 3.3 版更改: 引发 OverflowError 而不是 ValueError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并会在 localtime() 出错时引发 OSError 而不是 ValueError。

用法:date.fromtimestamp(timestamp)

from datetime import date
date.fromtimestamp(1339119900000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromtimestamp(1339120800000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'

注意: unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

date.fromordinal()

作用:返回对应于预期格列高利历序号的日期,其中公元 1 年 1 月 1 晶的序号为 1。

用法:date.fromordinal(ordinal)

from datetime import date
d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
d
datetime.date(2002, 3, 11)

date.fromisoformat()

作用:返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象

用法:date.fromisoformat(date_string)

from datetime import date
date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)

这是 date.isoformat() 的逆操作。它只支持 YYYY-MM-DD 格式。更通用的要用strptime

d.isoformat()
'2002-03-11'

date.fromisocalendar()

作用:返回指定 year, week 和 day 所对应 ISO 历法日期的 date。这是函数 date.isocalendar() 的逆操作。

用法:date.fromisocalendar(year, week, day)

今年的42周第三天是10月20号

date.fromisocalendar(2021, 42, 3)
datetime.date(2021, 10, 20)

3、类属性

date.min

最小的日期 date(MINYEAR, 1, 1) 。

from datetime import date
date.min
datetime.date(1, 1, 1)

date.max

最大的日期 ,date(MAXYEAR, 12, 31)。

from datetime import date
date.max
datetime.date(9999, 12, 31)

date.resolution

两个日期对象的最小间隔,timedelta(days=1)。

from datetime import date
date.resolution
datetime.timedelta(days=1)

date.year

在 MINYEAR 和 MAXYEAR 之间,包含边界。

from datetime import date 
d = date.today()#生成一个date对象
d
datetime.date(2021, 7, 5)
d.year
2021

date.month

1 至 12(含)

#接上述案例
d.month
7

date.day

返回1到指定年月的天数间的数字。

#接上述案例
d.day
5

3、实例方法

date.replace()

作用:返回一个具有同样值的日期,除非通过任何关键字参数给出了某些形参的新值。

用法:date.replace(year=self.year, month=self.month, day=self.day)

from datetime import date
d = date(2002, 12, 31)
d.replace(day=26)
datetime.date(2002, 12, 26)

date.timetuple()

作用:返回一个 time.struct_time,即 time.localtime() 所返回的类型。hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。

用法:date.timetuple(d)

d = date(2002, 12, 31)
date.timetuple(d)
time.struct_time(tm_year=2002, tm_mon=12, tm_mday=31, 
tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=365, 
tm_isdst=-1)

date.toordinal()

作用:返回日期的预期格列高利历序号,其中公元 1 年 1 月 1 日的序号为 1。对于任意 date 对象 d,date.fromordinal(d.toordinal()) == d。

d = date(1, 1, 1)
d.toordinal()
1
d = date(2002, 12, 31)
d.toordinal()
731215
date.fromordinal(d.toordinal())
datetime.date(2002, 12, 31)

date.weekday()

作用:返回一个整数代表星期几,星期一为0,星期天为6。

date(2002, 12, 4).weekday()
2

date.isoweekday()

作用:返回一个整数代表星期几,星期一为1,星期天为7。

date(2002, 12, 4).isoweekday()
3

date.isocalendar()

作用:返回一个由三部分组成的 named tuple 对象: year, week 和 weekday。

ISO 历法是一种被广泛使用的格列高利历。ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。一个 ISO 年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。

例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日.

from datetime import date
date(2003, 12, 29).isocalendar()
(2004, 1, 1) # 旧版本
datetime.IsoCalendarDate(year=2004, week=1, weekday=1) # 新版本
date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)

在 3.9 版更改: 结果由元组改为 named tuple。

date.isoformat()

作用:返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串

用法:date.isoformat(d)

from datetime import date
date(2021, 10, 1).isoformat()
'2021-10-01'

这是 date.fromisoformat() 的逆操作。

date.__str__()

作用:对于日期对象 d, str(d) 等价于 d.isoformat() 。

用法:date.__str__(d)

from datetime import date
date(2021, 10, 1).__str__()
'2021-10-01'
str(date(2021, 10, 1))
'2021-10-01'

date.ctime()

作用:返回一个表示日期的字符串,在原生 C ctime() 函数 (time.ctime() 会发起调用该函数,但 date.ctime() 则不会) 遵循 C 标准的平台上。

from datetime import date
date(2021, 10, 1).ctime()
'Fri Oct  1 00:00:00 2021'

d.ctime() 等效于 time.ctime(time.mktime(d.timetuple()))

d=date(2021, 10, 1)
import time
time.ctime(time.mktime(d.timetuple()))
'Fri Oct  1 00:00:00 2021'

date.strftime()

作用:翻译下就是 str from time将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串控制日期时间对象的输出格式,date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。要获取格式指令的完整列表,查看文末列表。

用法:date.strftime(format)

掌握了这个方法,随心所以的转换日期格式

import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.strftime("%Y-%m-%d")
'2021-10-01'
dt.strftime("%Y年%m月%d日")
'2021年10月01日'
dt.strftime("%Y//%m//%d")
'2021//10//01'
dt.strftime("%Y-%m-%d %H:%M")
'2021-10-01 00:00'
dt.strftime("%A, %d. %B %Y %I:%M%p")
'Friday, 01. October 2021 12:00AM'

date.__format__(format)

与 date.strftime() 相同。此方法使得为 date 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能。虽然不建议使用这个装逼,但是遇到别人装逼的时候我们得知道。要获取格式指令的完整列表,请看文末附表

import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.__format__("%Y年%m月%d日")
'2021年10月01日'

4、支持的运算

date2 = date1 + timedelta

date2 等于从 date1 减去 timedelta.days 天。(1)

date2 = date1 - timedelta

计算 date2 的值使得 date2 + timedelta == date1。(2)

timedelta = date1 - date2

(3)

date1 < date2

如果 date1 的时间在 date2 之前则认为 date1 小于 date2 。(4)

展开阅读全文

页面更新:2024-05-29

标签:夏时制   夏令时   时间   常量   范围内   字符串   随心所欲   精确   时区   模块   属性   对象   日期   格式   标准   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top