datetime时间模块相关用法

48 篇文章 1 订阅
17 篇文章 0 订阅
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

用法

根据给定的格式将对象转换为字符串

将字符串解析为给定相应格式的 datetime 对象

方法类型

实例方法

类方法

方法

date; datetime; time

datetime

签名

strftime(format)

strptime(date_string, format)

strftime()strptime() Format Codes

以下列表显示了 1989 版 C 标准所要求的全部格式代码,它们在带有标准 C 实现的所有平台上均可用。

指令

含义

示例

注释

%a

当地工作日的缩写。

Sun, Mon, ..., Sat (en_US);
So, Mo, ..., Sa (de_DE)

(1)

%A

本地化的星期中每日的完整名称。

Sunday, Monday, ..., Saturday (en_US);
Sonntag, Montag, ..., Samstag (de_DE)

(1)

%w

以十进制数显示的工作日,其中0表示星期日,6表示星期六。

0, 1, ..., 6

%d

补零后,以十进制数显示的月份中的一天。

01, 02, ..., 31

(9)

%b

当地月份的缩写。

Jan, Feb, ..., Dec (en_US);
Jan, Feb, ..., Dez (de_DE)

(1)

%B

本地化的月份全名。

January, February, ..., December (en_US);
Januar, Februar, ..., Dezember (de_DE)

(1)

%m

补零后,以十进制数显示的月份。

01, 02, ..., 12

(9)

%y

补零后,以十进制数表示的,不带世纪的年份。

00, 01, ..., 99

(9)

%Y

十进制数表示的带世纪的年份。

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(2)

%H

以补零后的十进制数表示的小时(24 小时制)。

00, 01, ..., 23

(9)

%I

以补零后的十进制数表示的小时(12 小时制)。

01, 02, ..., 12

(9)

%p

本地化的 AM 或 PM 。

AM, PM (en_US);
am, pm (de_DE)

(1), (3)

%M

补零后,以十进制数显示的分钟。

00, 01, ..., 59

(9)

%S

补零后,以十进制数显示的秒。

00, 01, ..., 59

(4), (9)

%f

以十进制数表示的微秒,在左侧补零。

000000, 000001, ..., 999999

(5)

%z

UTC 偏移量,格式为 ±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串)。

(空), +0000, -0400, +1030, +063415, -030712.345216

(6)

%Z

时区名称(如果对象为简单型则为空字符串)。

(空), UTC, EST, CST

%j

以补零后的十进制数表示的一年中的日序号。

001, 002, ..., 366

(9)

%U

以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。

00, 01, ..., 53

(7), (9)

%W

以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周。

00, 01, ..., 53

(7), (9)

%c

本地化的适当日期和时间表示。

Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)

(1)

%x

本地化的适当日期表示。

08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)

(1)

%X

本地化的适当时间表示。

21:30:00 (en_US);
21:30:00 (de_DE)

(1)

%%

字面的 '%' 字符。

%

为了方便起见,还包括了C89标准不需要的其他一些指令。这些参数都对应于ISO 8601日期值。

指令

含义

示例

注释

%G

带有世纪的 ISO 8601 年份,表示包含大部分 ISO 星期 (%V) 的年份。

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(8)

%u

以十进制数显示的 ISO 8601 星期中的日序号,其中 1 表示星期一。

1, 2, ..., 7

%V

以十进制数显示的 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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值