搞不懂 Python 中的时间操作,来看看这里吧!

我走过山的时候山不说话,我路过海的时候海不回答

搞不懂 Python 中的时间操作,来看看这里吧!_第1张图片

在 Python 使用过程中我们经常会遇到时间格式转换的问题,例如:

  • API 的返回结果中,时间参数多为 timestamp格式,为了方便展示给用户,我们一般需要将其格式化为 str
  • 当用户输入时间字符串时,我们需要转换为 timestamp格式,方便在程序中进行处理
  • 当我们需要对时间进行操作时(时间加减等),又需要将时间转换为 Datetime 格式进行一些便捷操作

看到这些时间之间的来回转换,你是否有点不知所措?

不用担心,Python 中提供了对时间日期的多种多样的处理方式,主要是在 timedatetimetimedelta 这三个模块中,今天稍微整理一下这两个模块在使用上的一些区别和联系。

文章目录

    • time
      • 基本使用
      • 参考
      • 小结
    • datetime
      • datetime.datetime
        • 类属性
        • 实例属性
        • 类方法
        • 实例方法
        • 支持的运算
      • datetime.timedelta
        • 类方法
        • 实例方法
        • 支持的运算

time

在 Python 文档中,time 是归类在 Generic Operating System Services。也就是说,它提供的功能更加接近于操作系统层面的,通过文档可知,time 模块是围绕着 Unix Timestamp 进行的。

需要注意的是该模块中的大多数函数调用了所在平台 C library 的同名函数,所以部分函数在不同的平台下可能会有不同的效果。

基本使用

  • time.time()

    获取浮点数格式的秒数时间戳

    虽然此函数通常返回非递减值,但如果两次调用之间修改了系统时间,则它可以返回比先前调用更低的值

    >>> time.time()
    1607842980.365472
    
  • time.gmtime([timestamp])

    将秒级时间戳转换为 UTC 的 时间元组

    若未提供 timestamp 或为 None, 则默认使用 time() 所返回的时间

    >>> time.gmtime(time.time())
    
    time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=7, tm_min=4, tm_sec=7, tm_wday=6, tm_yday=348, tm_isdst=0)
    
  • time.localtime([timestamp])

    gmtime() 相似但转换为当地时间

    >>> a = 1607843214
    
    >>> time.gmtime(a)
    time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=7, tm_min=6, tm_sec=54, tm_wday=6, tm_yday=348, tm_isdst=0)
    
    >>> time.localtime(a)
    time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=15, tm_min=6, tm_sec=54, tm_wday=6, tm_yday=348, tm_isdst=0)
    
  • time.mktime(t)

    将时间元组转换为秒级浮点时间戳

    localtime() 的反函数。参数为 完整的时间元组,表示 local 时间,而不是 UTC。

    >>> t = time.localtime(time.time())
    >>> time.mktime(t)
    1607814414.0
    
  • time.strftime(format[, t])

    将时间元组格式化为时间字符串

    如果为提供 t,则使用由 localtime() 返回的当前时间

    >>> time.strftime('%x %X')
    12/13/20 15:53:59
    
  • time.strptime(string[, format])

    将字符串转换为时间元组

    >>> time.strptime('2020-12-12 15:55:21', '%Y-%m-%d %H:%M:%S')
    
    time.struct_time(tm_year=2020, tm_mon=12, tm_mday=12, tm_hour=15, tm_min=55, tm_sec=21, tm_wday=5, tm_yday=347, tm_isdst=-1)
    

参考

  • 时间元组 (struct_time)

    共有九个元素(年,月,日,时,分,秒,一周的第几日,一年中的第几天,夏令时)

    属性 描述
    tm_year 年 (4位数) 2020
    tm_mon 1 - 12
    tm_mday 1 - 31
    tm_hour 小时 0 - 23
    tm_min 分钟 0 - 59
    tm_sec 0 - 61 ( 60,61为闰秒 )
    tm_wday 一周第几日 0 - 6 ( 0 为周一 )
    tm_yday 一年第几日 1 - 366
    tm_isdst 夏令时 -1, 0, 1 (-1是决定是否为夏令时的旗帜)
  • 格式化时间字符串(Format String)

    格式 描述 示例值
    %y 两位数年份表示 00 - 99
    %Y 四位数年份表示 0000 - 9999
    %m 月份 01 - 12
    %d 月内某一天 0 - 31
    %H 24小时制小时数 0 - 23
    %I 12小时制小时数 01 - 12
    %M 分钟数 00 - 59
    %S 00 - 59
    %a 简化的星期名称 Sun
    %A 完整的星期名称 Sunday
    %b 简化的月份名称 Dec
    %B 完整的月份名称 December
    %c 本地的日期和时间表示 Sun Dec 13 15:42:21 2020
    %j 年内的一天 348
    %p 本地化的 AM 或 PM PM
    %U 一年中的星期数(星期日为星期的开始) 00 - 53
    %w 星期(星期日为星期的开始) 0 - 6
    %W 一年中的星期数(星期一为星期的开始) 00 - 53
    %x 本地相应的日期表示 12/13/20
    %X 本地相应的时间表示 15:42:21
    %% % 号本身 %

小结

  • 时间戳是计算机能够识别的时间

  • 时间字符串是人能够看懂的时间

  • 时间元组是用来操作时间的

    搞不懂 Python 中的时间操作,来看看这里吧!_第2张图片

datetime

datetime 比 time 高级了不少,可以理解为 datetime 基于 time 进行了封装,提供了更多使用的函数。在 datetime 模块中包含了一下几个类:

object
	timedelta    # 用于计算时间间隔
	tzinfo       # 时区相关
	time         # 只关注时间
	date         # 只关注日期
		datetime     # 时间和日期组合

实际应用中,使用较多的是 datetime.datetimedatetime.timedeltadatetimedatetime 并无太大区别

datetime.datetime

类属性

类属性 描述
datetime.min datetime 对象实例能表示的最小的日期时间 datetime.datetime(1, 1, 1, 0, 0)
datetime.max datetime 对象实例能表示的最大的日期时间 datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)

实例属性

实例属性 描述
year datetime 对象的年份 2020
month 月份 12
day 13
hour 小时 17
minute 分钟 9
second 12
microsecond 毫秒 588919

类方法

  • class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

    构造器

    year, month, day 参数是必须的。其余参数必须是下面范围内的整数:

    • 1 <= year <= 9999
    • 1 <= month <= 12
    • 1 <= day <= 指定年月的天数
    • 0 <= hour < 24
    • 0 <= minute < 60
    • 0 <= second < 60
    • 0 <= microsecond < 1000000
    • fold in [0, 1]
  • datetime.today()

    返回当前本地日期时间的的 datetime 对象

    >>> from datetime import datetime
    >>> datetime.today()
    datetime.datetime(2020, 12, 13, 16, 36, 51, 864575)
    
  • datetime.now(tz=None)

    返回当前本地日期时间的 datetime 对象,与 datetime.today() 类似

    >>> datetime.now()
    datetime.datetime(2020, 12, 13, 16, 39, 6, 274263)
    
  • datetime.utcnow()

    返回当前 UTC 日期时间

    >>> datetime.utcnow()
    datetime.datetime(2020, 12, 13, 8, 40, 19, 881473)
    
  • datetime.fromtimestamp(timestamp,tz=None)

    返回时间戳以你的本地日期和时间

    >>> datetime.fromtimestamp(time.time())
    datetime.datetime(2020, 12, 13, 16, 41, 45, 421366)
    
  • datetime.strptime()

    字符串转 datetime 对象

    >>> datetime.strptime('2020-12-13 16:45:21', '%Y-%m-%d %H:%M:%S')
    datetime.datetime(2020, 12, 13, 16, 45, 21)
    

实例方法

  • datetime.date()

    返回与 datetime对象实例有相同的 year、month 和 day 属性的 date 对象实例

    >>> d = datetime.now()
    >>> d.date()
    datetime.date(2020, 12, 13)
    
  • datetime.time()

    返回与 datetime对象实例有相同的 hour、minute、second、microsecond、fold 属性的 time 对象实例,并且 tzinfo 属性为None

    >>> d = datetime.now()
    >>> d.time()
    datetime.time(16, 49, 22, 878530)
    
  • datetime.replace(*args, **kwargs)

    返回由指定的关键字参数替换 datetime 对象实例中同名属性值后的新的 datetime 对象实例

    >>> d = datetime.now()
    >>> d.replace(year=2019)
    datetime.datetime(2019, 12, 13, 16, 51, 11, 271730)
    
  • datetime.timetuple()

    将 datetime 转换为 time.struct_time (时间元组)

    等价于 time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, -1))

    >>> d = datetime.now()
    >>> d.timetuple()
    time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=16, tm_min=54, tm_sec=30, tm_wday=6, tm_yday=348, tm_isdst=-1)
    
  • datetime.timestamp()

    返回 datetime 实例对应的时间戳,返回值为类似 time.time()的浮点数

    >>> d = datetime.now()
    >>> d.timestamp()
    1607849839.759806
    
  • datetime.weekday()

    返回当前日期在一周内的序号,周一为 0

    >>> d = datetime.now()
    >>> d.weekday()
    6
    
  • datetime.isocalendar()

    返回一个包含给定日期时间对象的 ISO year、ISO week number 和 ISO weekday 的三元组

    >>> d = datetime.now()
    >>> d.isocalendar()
    (2020, 50, 7)
    
  • datetime.strftime(format)

    datetime 实例转字符串

    >>> d = datetime.now()
    >>> d.strftime('%Y-%m-%d %H:%M:%S')
    '2020-12-13 17:02:29'
    

支持的运算

  • datetime2 = datetime1 + timedelta

  • datetime2 = datetime1 - timedelta

  • timedelta = datetime1 - datetime2

  • datetime1 < datetime2

datetime.timedelta

timedelta 对象表示两个日期或时间之间的间隔

类方法

  • datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

    所有参数都是可选的并且默认为 0,这些参数可以是整型或者浮点型,也可是整数或者负数

    只有 days, seconds, microseconds 会存储在内部。参数单位的换算规则如下:

    • 1毫秒 => 1000 微秒
    • 1分钟 => 60秒
    • 1小时 => 3600秒
    • 1星期 => 7天

    并且 days, seconds, microseconds 会经过标准化处理保证表达方式的唯一性

    • 0 <= microseconds < 1000000
    • 0 <= seconds < 3600*24 (一天的秒数)
    • -999999999 <= days <= 999999999
    form datetime import timedelta
    >>> delta = timedelta(
    ...     days=50,
    ...     seconds=10,
    ...     microseconds=29000,
    ...     minutes=5,
    ...     hours=8,
    ...     weeks=2
    ... )
    >>> delta
    datetime.timedelta(days=64, seconds=29110, microseconds=29000)
    

实例方法

  • timedelta.total_seconds()

    返回时间间隔包含了多少秒

    时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)

    >>> delta = timedelta(weeks=10000)
    >>> delta.total_seconds()
    6048000000.0
    

支持的运算

运算 结果
t1 = t2 + t3 t2 和 t3 的和
t1 = t2 - t3 t2 减 t3 的差
t1 = t2 * i 乘以一个整数
t1 = t2 * f 乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍(精度使用四舍五偶入奇不入)
f = t2 / t3 两个时间间隔相除,返回一个 float 对象
t1 = t2 / f 除以一个 浮点数 或者整数,结果会被舍入到 timedelta 最接近的整数倍
t2 // i or t2 // t1 整除一个浮点数 或者 timedelta 对象
t2 % t3 余数为一个 timedelta 对象
+t1 返回一个相同的 timedelta 对象
-t1 等价于 timedelta(-t1.days, -t1.seconds, -t1.microseconds)
abs(t) t.days >= 0 时等于 +t, 当 ``t.days < 0时等于-t`
str(t) '0:00:03' or '-1 day, 23:59:57'
repr(t) 'datetime.timedelta(seconds=3)'

你可能感兴趣的:(Python,python,time,datetime,timedelta,时间)