date
- 用法一
datetime.date(year, month, day)
正确实例:
>>> from datetime import date
>>> date(2020,9,4)
datetime.date(2020, 9, 4)
错误实例:
>>> date(2020,09,04)
File "<stdin>", line 1
date(2020,09,04)
^
SyntaxError: invalid token
>>> date(2020,2,30)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: day is out of range for month
注意:
year, month, day均为正数类型
year为四位年份
month:1-12(1月份不能01)
day:只能为指定月份的天数,否则会出错
- 用法二
datetime.date.today()
返回当前的本地日期。
这等价于 date.fromtimestamp(time.time())
>>> from datetime import date
>>> import time
>>> a=date.today()
>>> b=date.fromtimestamp(time.time())
>>> a
datetime.date(2020, 9, 4)
>>> b
datetime.date(2020, 9, 4)
>>> a==b
True
- 用法三
date.replace(year=self.year, month=self.month, day=self.day)
>>> from datetime import date
>>> d = date(2020, 9, 1)
>>> d.replace(day=4)
datetime.date(2020, 9, 4)
- 用法四
date.timetuple()
返回一个 time.struct_time,即 time.localtime() 所返回的类型。
hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1
>>> c=a.timetuple()
>>> c
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=4, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=248, tm_isdst=-1)
- 用法五
date.weekday()
返回一个整数代表星期几,星期一为0,星期天为6。例如, date(2002, 12, 4).weekday() == 2,表示的是星期三
>>> today=datetime.today()
>>> today.weekday()
4
- 用法六
date.isoweekday()
返回一个整数代表星期几,星期一为1,星期天为7。例如:date(2002, 12, 4).isoweekday() == 3,表示星期三
>>> today=datetime.today()
>>> today.weekday()
4
>>> today.isoweekday()
5
- 用法七
date.isocalendar()
返回一个三元元组,(ISO year, ISO week number, ISO weekday)
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)
>>> date(2004, 1, 4).isocalendar()
(2004, 1, 7)
>>> today.isocalendar()
(2020, 36, 5)
- 用法八
date.isoformat()
>>> from datetime import date, datetime
>>> date(2002, 12, 4).isoformat()
'2002-12-04'
>>> datetime.now().isoformat()
'2020-09-04T16:46:10.092723'
>>> datetime.today().isoformat()
'2020-09-04T16:46:28.860177'
- 用法九
date.ctime()
返回一个表示日期的字符串
>>> datetime.today().ctime()
'Fri Sep 4 16:48:28 2020'
- 用法十
strftime() 和 strptime() 的行为
date.strftime(format)
返回一个由显式格式字符串所指明的代表日期的字符串。 表示时、分或秒的格式代码值将为 0
date, datetime 和 time 对象都支持 strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。
相反地,datetime.strptime() 类会根据表示日期和时间的字符串和相应的格式字符串来创建一个 datetime 对象。
下表提供了 strftime() 与 strptime() 的高层级比较:
|
| |
---|---|---|
用法 | 根据给定的格式将对象转换为字符串 | 将字符串解析为给定相应格式的 |
方法类型 | 实例方法 | 类方法 |
方法 | ||
签名 |
|
|
strftime()
和 strptime()
Format Codes¶
以下列表显示了 1989 版 C 标准所要求的全部格式代码,它们在带有标准 C 实现的所有平台上均可用。
指令 | 含义 | 示例 | 注释 |
---|---|---|---|
| 当地工作日的缩写。 |
Sun, Mon, ..., Sat (en_US);
So, Mo, ..., Sa (de_DE)
| (1) |
| 本地化的星期中每日的完整名称。 |
Sunday, Monday, ..., Saturday (en_US);
Sonntag, Montag, ..., Samstag (de_DE)
| (1) |
| 以十进制数显示的工作日,其中0表示星期日,6表示星期六。 | 0, 1, ..., 6 | |
| 补零后,以十进制数显示的月份中的一天。 | 01, 02, ..., 31 | (9) |
| 当地月份的缩写。 |
Jan, Feb, ..., Dec (en_US);
Jan, Feb, ..., Dez (de_DE)
| (1) |
| 本地化的月份全名。 |
January, February, ..., December (en_US);
Januar, Februar, ..., Dezember (de_DE)
| (1) |
| 补零后,以十进制数显示的月份。 | 01, 02, ..., 12 | (9) |
| 补零后,以十进制数表示的,不带世纪的年份。 | 00, 01, ..., 99 | (9) |
| 十进制数表示的带世纪的年份。 | 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 | (2) |
| 以补零后的十进制数表示的小时(24 小时制)。 | 00, 01, ..., 23 | (9) |
| 以补零后的十进制数表示的小时(12 小时制)。 | 01, 02, ..., 12 | (9) |
| 本地化的 AM 或 PM 。 |
AM, PM (en_US);
am, pm (de_DE)
| (1), (3) |
| 补零后,以十进制数显示的分钟。 | 00, 01, ..., 59 | (9) |
| 补零后,以十进制数显示的秒。 | 00, 01, ..., 59 | (4), (9) |
| 以十进制数表示的微秒,在左侧补零。 | 000000, 000001, ..., 999999 | (5) |
| UTC 偏移量,格式为 | (空), +0000, -0400, +1030, +063415, -030712.345216 | (6) |
| 时区名称(如果对象为简单型则为空字符串)。 | (空), UTC, EST, CST | |
| 以补零后的十进制数表示的一年中的日序号。 | 001, 002, ..., 366 | (9) |
| 以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。 | 00, 01, ..., 53 | (7), (9) |
| 以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周。 | 00, 01, ..., 53 | (7), (9) |
| 本地化的适当日期和时间表示。 |
Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
| (1) |
| 本地化的适当日期表示。 |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
| (1) |
| 本地化的适当时间表示。 |
21:30:00 (en_US);
21:30:00 (de_DE)
| (1) |
| 字面的 | % |
为了方便起见,还包括了C89标准不需要的其他一些指令。这些参数都对应于ISO 8601日期值。
指令 | 含义 | 示例 | 注释 |
---|---|---|---|
| 带有世纪的 ISO 8601 年份,表示包含大部分 ISO 星期 ( | 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 | (8) |
| 以十进制数显示的 ISO 8601 星期中的日序号,其中 1 表示星期一。 | 1, 2, ..., 7 | |
| 以十进制数显示的 ISO 8601 星期,以星期一作为每周的第一天。 第 01 周为包含 1 月 4 日的星期。 | 01, 02, ..., 53 | (8), (9) |
这些代码可能不是在所有平台上都可与 strftime()
方法配合使用。 ISO 8601 年份和 ISO 8601 星期指令并不能与上面的年份和星期序号指令相互替代。 调用 strptime()
时传入不完整或有歧义的 ISO 8601 指令将引发 ValueError
。
对完整格式代码集的支持在不同平台上有所差异,因为 Python 要调用所在平台的 C 库的 strftime()
函数,而不同平台的差异是很常见的。 要查看你所用平台所支持的完整格式代码集,请参阅 strftime(3) 文档。
3.6 新版功能: 增加了 %G
, %u
和 %V
。
参考文章:https://docs.python.org/zh-cn/3/library/datetime.html#date-objects
注意
由于不同国家可能时间的表示方式也有所不同,说白了就是语种的问题,那么我们就得切换到当地时间类型再进行格式化
如下:
美国时间格式
-
a: 29 July 2020
-
b: August 29, 2020
德国地区时间格式
-
a: 30. Juli 2020
-
b: 2. Mai 20 2020
中国时间格式
- 2020年9月04日
处理方案:
import locale
locale.setlocale(locale.LC_ALL, "国家英文简称")
locale.setlocale(locale.LC_ALL, "us") #美国
locale.setlocale(locale.LC_ALL, "de") #德国
locale.setlocale(locale.LC_ALL, "uk") #英国
然后再结合对应的时间结构进行格式化:
>>> t='29 July 2020'
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "us")
'English_United States.1252'
>>> from datetime import datetime
>>> t_ret = datetime.strptime(t,'%d %B %Y')
>>> t_ret
datetime.datetime(2020, 7, 29, 0, 0)
如果德国时区时间用美国的方式进行格式化就会出现问题:
>>> t_de ='30. Juli 2020'
>>> t_deret = datetime.strptime(t_de,'%d. %B %Y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 565, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '30. Juli 2020' does not match format '%d. %B %Y'
解决方案:把时区切换为德国时区再进行格式化
>>> locale.setlocale(locale.LC_ALL, "de")
'de'
>>> t_deret = datetime.strptime(t_de,'%d. %B %Y')
>>> t_deret
datetime.datetime(2020, 7, 30, 0, 0)