python专题时间模块

一 前言

此篇时间专题,知识追寻者发了比较大的代价完成,虽然还有许多不足之处,但对于日常开发是足够用了,比如获取当前时间,当前日期,时间与字符串格式互转,从时间戳中获取时间对象等等;如果读者还想深入学习,可以参考官方文档;

公众号:知识追寻者

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 日期时间类型概览

类型 说明
datetime.date 日期,属性是,yer, month, day
datetime.time 时间;属性是hour, minute, second, microsecond, tzinfo
datetime.datetime 日期和时间;属性是date 和 time 的 并集
datetime.timedelta 可以是两个date, time 或者 datetime之间的时间差
datetime.tzinfo 时区的抽象类;给time或者 datetime 提供自定义的时间调整
datetime.timezone datetime.tzinfo的具体实现,用于矫正UTC时间偏移

三 date

3.1 date函数概览

函数名称 函数介绍
date.today() 返回当前本地时间
date.fromtimestamp() 从时间搓中返回时间
date.fromisoformat(date_string) YYYY-MM-DD中获取日期对象
date.fromisocalendar(year, week, day) 指定年,周,天获得日期对象
date.replace(year=self.year, month=self.month, day=self.day) 取代任意一个属性,返回date对象
date.timetuple() 返回一个time.struct_time
date.toordinal() 返回日期对应的 Gregorian Calendar 日期
date.weekday() 返回星期 0 ~ 6 (0是星期一)
date.isoweekday() 返回星期 1 ~ 7 (1是星期一)
date.isocalendar() 返回元组(ISO year, ISO week number, ISO weekday)
date.isoformat() 返回一个格式化为YYYY-MM-DD的日期
date.__str__() 对于date对象,等同于date.isoformat()
date.ctime() 字符串代表时间
date.strftime(format) 时间自定义格式化
date.__format__(format) 与date.strftime(format)类似

3.2 date属性概览

属性名称 属性介绍
date.min 代表日期的最小值,date(MINYEAR, 1, 1)
date.max 代表日期的最大值,date(MAXYEAR, 12, 31)
date.resolution 两个日期对象的最小间隔
date.year 日期的年份,MINYEAR - MAXYEAR
date.month 日期月份,1-12
date.day 返回指定的天数

3.3 today()

当前日期

# -*- coding: utf-8 -*-

from datetime import date

print(date.today())

输出

2020-01-31

3.4 fromtimestamp()

来自时间戳返回一个当前日期对象

# -*- coding: utf-8 -*-

from datetime import date

print(date.fromtimestamp(1580473517.3424315))

输出

2020-01-31

3.5fromisoformat(date_string)

来自字符串返回一个日期对象

# -*- coding: utf-8 -*-

from datetime import date

local_date = date.fromisoformat('2020-01-31')
print(type(local_date))
print(local_date)

输出

<class 'datetime.date'>
2020-01-31

3.6 fromisocalendar(year, week, day)

指定 年份, 周, 天 获得 日期对象

# -*- coding: utf-8 -*-

from datetime import date

specify_date = date.fromisocalendar(2020, 4, 3)
print(type(specify_date))
print(specify_date)

输出

<class 'datetime.date'>
2020-01-22

3.7 date.replace()

可以取代年,或者月,或者日;下面代码中以日为例:

# -*- coding: utf-8 -*-

from datetime import date

current_date = date(2020,1,31)
rep_date = current_date.replace(day=1)
print(type(rep_date))
print(rep_date)

输出

<class 'datetime.date'>
2020-01-01

3.8 timetuple()

返回一个时间元组,读者可以对其进行迭代;

# -*- coding: utf-8 -*-

from datetime import date

current_date = date.today()
print(current_date.timetuple())

输出

time.struct_time(tm_year=2020, tm_mon=1, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=31, tm_isdst=-1)

3.9 date.toordinal()

unix时间(UTC) 与 Gregorian (公厉时间)时间互转

# 当前时间
current_date = date.today()
# 时间转换
ordinal = date.fromordinal(current_date.toordinal())
print(ordinal)

输出

2020-02-01

3.10 date.weekday()

0 表示星期一,以此类推(0-6);5表示星期六;

# -*- coding: utf-8 -*-

from datetime import date
# 当前时间
current_date = date.today()
print(current_date.weekday())

输出

5

3.11date.isoweekday()

1 表示星期一,6表示星期六,以此类推(1-7);

# -*- coding: utf-8 -*-

from datetime import date
# 当前时间
current_date = date.today()
print(current_date.isoweekday())

输出

6

3.12date.isocalendar()

返回元组(ISO year, ISO week number, ISO weekday); 2020-2-1 号 表示 2020 年 第五周的第六天;

# -*- coding: utf-8 -*-

from datetime import date

# 当前时间
current_date = date.today()
print(current_date.isocalendar())

输出

(2020, 5, 6)

3.13 date.isoformat()

返回一个格式化为YYYY-MM-DD的日期

# -*- coding: utf-8 -*-

from datetime import date

# 指定时间
specify_date = date(2020,2,1)
print(specify_date.isoformat())

输出

2020-02-01

3.14 date.__str__()

对于date 等同于date.isoformat();

# -*- coding: utf-8 -*-

from datetime import date

# 指定时间
specify_date = date(2020,2,1)
print(specify_date.__str__())

输出

2020-02-01

3.15 date.ctime()

字符串形式表示时间

# -*- coding: utf-8 -*-

from datetime import date

# 指定时间
specify_date = date(2020,2,1)
print(specify_date.ctime())

输出

Sat Feb  1 00:00:00 2020

3.16 date.strftime(format)

日期格式化,具体的字符串代表含义看第四节

# -*- coding: utf-8 -*-

from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.strftime('%Y%m%d'))

输出

20200201

3.17date.__format__(format)

功能类似date.strftime(format);

# -*- coding: utf-8 -*-

from datetime import date

# 指定时间
specify_date = date(2020,2,1)
print(specify_date.__format__('%Y%m%d'))

输出

20200201

四 格式化符号

格式化符号如下,只需要记住常用的几个符号代表,当有使用到时再来查阅文档即可;

  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %H 24小时制小时数(0-23)
  • %I 12小时制小时数(01-12)
  • %M 分钟数(00=59)
  • %S 秒(00-59)
  • %a 本地简化星期名称
  • %A 本地完整星期名称
  • %b 本地简化的月份名称
  • %B 本地完整的月份名称
  • %c 本地相应的日期表示和时间表示
  • %j 年内的一天(001-366)
  • %p 本地A.M.或P.M.的等价符
  • %U 一年中的星期数(00-53)星期天为星期的开始
  • %w 星期(0-6),星期天为星期的开始
  • %W 一年中的星期数(00-53)星期一为星期的开始
  • %x 本地相应的日期表示
  • %X 本地相应的时间表示
  • %Z 当前时区的名称
  • %% %号本身s

五 datetime模块中的time

知识追寻者在time模块具有同等功能的函数将不再重复给出示例;注意这篇文章给出的time是 datetime引入的time; 不是直接引入的time模块

5.1 time 属性

fold 属性 知识追寻者也没研究代表什么;

属性名称 属性介绍
time.min 最小时间;time(0, 0, 0, 0)
time.max 最大时间;time(23, 59, 59, 999999)
time.resolution 两个时间之间最小间隔
time.hour 小时;0-24
time.minute 分钟;0-60
time.second 秒;0-60
time.microsecond 微妙;0-1000000
time.tzinfo 作为参数传给time的构造函数

5.2time 函数

函数名称 函数介绍
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, ** fold=0*) 给出一个属性,取代其值,生成新的时间;
time.__str__() 对于time等同于time.isoformat()
time.isoformat() 返回一个 ISO 8601 格式的日期字符串,类似HH:MM:SS
time.strftime(format) 返回自定义格式的时间
time.__format__(format) 与 time.strftime(format) 类似
time.utcoffset() 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.utcoffset(self)
time.dst() 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.dst(self)
time.tzname() 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.tzname(self)

5.3time.replace

取代一个时间属性获得新的time对象

# -*- coding: utf-8 -*-

from datetime import time


current_time = time(9,10,2)
print(current_time.replace(hour=8))

输出

08:10:02

5.4 time.isoformat()

会根据你给的时间模式给出不同的时间支持 HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]

# -*- coding: utf-8 -*-

from datetime import time
# 给定时间 小时,分钟,秒
current_time = time(9,10,2)
print(current_time.isoformat())
# 给定时间 小时,分钟,秒,微妙
other_time = time(9,10,2,3666)
print(other_time.isoformat())

输出

09:10:02
09:10:02.003666

5.5 time.strftime(format)

# -*- coding: utf-8 -*-

from datetime import time

current_time = time(9,10,2)
print(current_time.strftime('%H%M%S'))

输出

091002

六 time

本节的time是直接的time模块

6.1 time 函数

time常用函数如下

函数名称 函数介绍
time.time( ) 获取当前时间的时间戳
time.sleep(secs) 推迟线程运行的秒数
time.strftime(fmt[,tupletime]) 时间格式化,返回字符串
time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') 时间格式化,返回元组
time.localtime([secs] 给定一个时间戳,返回时间元组
time.ctime([secs]) 返回一个字符串表示的时间

6.2 time.time( )

返回一个当前时间的时间戳

# -*- coding: utf-8 -*-

import time

print(time.time())

输出

1580564033.1096103

6.3 time.sleep(secs)

读者在执行下面这段代码时,线程会等待5秒才会执行完毕

# -*- coding: utf-8 -*-

import time

time.sleep(5)

6.4 time.strftime()

时间格式化,返回字符串

# -*- coding: utf-8 -*-

import time

print(time.strftime(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))

输出

2020-02-01 21:37:22

6.5 time.localtime()

返回一个本地时间的元组格式

# -*- coding: utf-8 -*-

import time

print(time.localtime())

输出

time.struct_time(tm_year=2020, tm_mon=2, tm_mday=1, tm_hour=21, tm_min=40, tm_sec=14, tm_wday=5, tm_yday=32, tm_isdst=0)

6.6 time.ctime()

字符串形式表示时间

# -*- coding: utf-8 -*-

import time

print(time.ctime())

输出

Sat Feb  1 21:43:49 2020

七 datetime

有了date 和 time 基本功能 学 datetime 和容易,毕竟是date 和 time的 组合体;所以本节中datetime的属性就不做多余介绍就是date, time的属性并集;datetime与date,time的很多重名函数将也不在重复介绍,功能都相同;

7.1 datetime常用函数

函数名称 函数介绍
datetime.today() 获取当前时间,本地时间格式
datetime.now(tz=None) 返回当前时间
datetime.date() 返回一个date对象,剔除time部分
datetime.time() 返回一个time对象,剔除date部分
datetime.timetz() 返回一个time对象并且包含时区部分,剔除date部分
datetime.fromtimestamp(timestamp, tz=None) 从时间戳获取unix时间
datetime.combine(date, time) 将date,time结合为datetime对象
datetime.strptime(date_string, format) 时间格式化,返回字符串
datetime.strptime( date_string, format) 通过字符串返回时间

7.2 datetime.today()

# -*- coding: utf-8 -*-
from datetime import datetime, time, date

print(datetime.today())

输出

2020-02-01 22:03:31.041202

7.2 datetime.now()

# -*- coding: utf-8 -*-
from datetime import datetime, time, date

print(datetime.today())

输出

2020-02-01 22:08:18.077103

7.3datetime. fromtimestamp()

从时间戳中获取Unix时间

# -*- coding: utf-8 -*-
from datetime import datetime, time, date
import time as zszxz_time


specify_time = datetime(2020,2,1,22,9,30,30)
print(specify_time.fromtimestamp(zszxz_time.time()))

输出

2020-02-01 22:13:05.058196

7.4datetime.combine()

# -*- coding: utf-8 -*-
from datetime import datetime, time, date

time = time(22,18,0)
date = date(2020,2,1)
print(datetime.combine(date,time))

输出

2020-02-01 22:18:00

7.5 datetime.strptime()

时间转字符串

# -*- coding: utf-8 -*-
from datetime import datetime, time, date

specify_time = datetime(2020,2,1,22,9,30)
print(specify_time.strftime('%Y/%m/%d %H/%M/%S'))

输出

2020/02/01 22/09/30

7.6datetime.strptime()

字符串转时间

# -*- coding: utf-8 -*-
from datetime import datetime, time, date

print(datetime.strptime('2020/02/01 22/09/30','%Y/%m/%d %H/%M/%S'))

输出

2020-02-01 22:09:30

八 timedelta

timedelta是一个时间增量用于对我们原有的时间进行加减等操作,时间增量是不以年分,月份为计量;以下代码给出简单的timedelta操作,很容易推理出日常操作;如果还想深入研究可以参考官方文档;

8.1 指定时间增量

from datetime import datetime,timedelta

delta = timedelta(
     days=50,
     seconds=27,
     microseconds=10,
     milliseconds=29000,
     minutes=5,
     hours=8,
     weeks=2
 )
print(type(delta))
print(delta)

输出

<class 'datetime.timedelta'>
64 days, 8:05:56.000010

8.2 对时间进行加操作

from datetime import datetime,timedelta

# 当前时间
current = datetime.now()
# 时间增量 天数
delta = timedelta(days=100)
# 当前时间 加上 增量天数
print(current+delta)

输出

2020-05-11 22:45:05.199823

九 参考文档

python官方文档

https://docs.python.org/3/library/datetime.html#time-objects

posted @ 2020-05-07 14:42  知识追寻者  阅读(160)  评论(0编辑  收藏  举报