当前位置: 首页 > news >正文

python之time与datetime模块

python之time与datetime模块

文章目录

  • python之time与datetime模块
    • 引入
      • 什么是time与datetime模块
      • UTC 和 DST
    • 一、time模块
      • python中时间的三种表达方式
        • 时间戳(timestamp)
        • 格式化时间字符串(Format String)
          • 格式化字符串的时间格式中字符对应关系
        • 结构化时间(struct_time)元组
          • 元组 (struct_time) 九个元素的含义 :
      • 三种时间格式之间的转换(掌握)
        • 转换图
        • 格式转换操作 (需要掌握的操作)
        • time模块其他常用方法
          • time.sleep(n)
      • 另外一种:结构化时间与时间戳转换成格式化字符串时间形式(了解)
      • 1.asctime( )
      • 2.ctime( )
    • 二、datetime模块
      • 1.datetime的主要作用
      • 2.time 模块与 datetime 模块的不同点
      • 3.常用功能介绍

引入

什么是time与datetime模块

  • 处理python中与时间有关的标准库模块

补充说明: Python 时间处理模块还有 calendar 模块

UTC 和 DST

  • UTC(Coordinated Universal Time,世界协调时)格林威治天文时间,世界标准时间, 在中国 : UTC+8
  • DST(Daylight Saving Time)夏令时
import time
print(time.localtime()) #本地时区的struct_time
print(time.gmtime())    #UTC时区的struct_time

一、time模块

python中时间的三种表达方式

时间戳(timestamp)

  • 通常来说,时间戳表示的是从1970年1月1日00:00:00开始到现在经过的秒数,主要应用于时间间隔的计算
  • 返回时间戳的方式主要有time( ),clock( )等, 运行print(type(time.time())), 返回的是float类型
import time
print(time.time()) # 1608514272.7769537
print(type(time.time())) # <class 'float'>

格式化时间字符串(Format String)

  • 主要用于展示时间。例如:2020-12-21 09:38:45
  • 表示形式:%Y-%m-%d %H:%M:%S: 对应的是年,月,日,时,分,秒.(%X等同于%H:%M:%S的表现形式,%p: 对应的是上午AM )

示例:

import time
print(time.strftime('%Y-%m-%d %X'))  #2020-12-21 09:38:45
print(time.strftime('%Y-%m-%d %H:%M:%S')) #2020-12-21 09:38:45
print(time.strftime('%Y-%m-%d %X %p')) #2020-12-21 09:38:45 AM

格式化字符串的时间格式中字符对应关系
%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 当前时区的名称  # 乱码
%% %号本身

结构化时间(struct_time)元组

  • 获取当前时间的某一部分
  • struct_time元组共有9个元素共九个元素: (年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
  • 结构化的时间格式分为两种: 一种是世界时间,一种是本地时间。两者之间唯一不同的就是小时。
  • 返回 struct_time 的函数主要有 : localtime( ), gmtime( ), strptime( )
# 本地时区的struct_time: localtime()
import time
res = time.localtime()
print(res) # time.struct_time(tm_year=2020, tm_mon=12, tm_mday=21, tm_hour=10, tm_min=0, tm_sec=44, tm_wday=0, tm_yday=356, tm_isdst=0)
print(res.tm_mday) # 21
print(res.tm_wday) # 0
print(res.tm_yday) # 356
print(type(time.localtime()))  # <class 'time.struct_time'>
print(time.localtime()[3])     # 10


# 世界时间UTC时区的struct_time(了解) : gmtime()
import time
res = time.gmtime()
print(res)  # time.struct_time(tm_year=2020, tm_mon=12, tm_mday=21, tm_hour=2, tm_min=5, tm_sec=30, tm_wday=0, tm_yday=356, tm_isdst=0)

print(type(time.gmtime()))     # <class 'time.struct_time'>
print(time.gmtime()[0])        # 2020
元组 (struct_time) 九个元素的含义 :
索引(Index)属性(Attribute)值(Values)
0tm_year(年)比如2011
1tm_mon(月)1 - 12
2tm_mday(日)1 - 31
3tm_hour(时)0 - 23
4tm_min(分)0 - 59
5tm_sec(秒)0 - 61
6tm_wday(weekday)0 - 6(0表示周日)
7tm_yday(一年中的第几天)1 - 366
8tm_isdst(是否是夏令时)默认为-1

三种时间格式之间的转换(掌握)

转换图

  • 计算机能认识的时间只能是 “时间戳” 格式
  • 而人类能看懂的时间是 “格式化的时间字符串”“结构化的时间”, 于是就有了转换关系

img

格式转换操作 (需要掌握的操作)

  • 时间格式的转换是基于结构化的时间为基础的。结构化的时间相当于是中间的中转站。
  • 结构化时间时间戳之间的转化
    • time.mktime([结构化时间]) : “struct_time” 转换 “timestamp”
    • time.localtime([时间戳]) : “timestamp” 转换 “struct_time” 本地时区
    • time.gmtime([时间戳]) : “timestamp” 转换 “struct_time” UTC时区
    • time.gmtime([time.time()])
import time

# "struct_time" 转换 "timestamp"
print(time.mktime(time.localtime()))   # 1608519497.0
print(time.mktime(time.gmtime()))      # 1608490697.0

#"timestamp" 转换 "struct_time"
print(time.localtime(456465.4685))  # 返回的是"struct_time"本地时区元组
print(time.localtime(time.time()))  # 里面不填时间戳默认就是当前时间戳"time.time()"

print(time.gmtime(456465.4685))     # 返回的是"struct_time"UTC时区元组
print(time.gmtime(time.time()))
  • 结构化时间格式化字符串时间之间的转换

    • time.strftime([时间格式],[结构化时间]) : “struct_time” 转换 “format time”

    • time.strptime([格式化的字符串时间],[时间格式]) : “format time” 转换 “struct_time”

      import time
      
      # "struct_time" 转换 "format time"
      print(time.strftime("%Y/%m/%d %X %p"))        # 2020/12/21 11:00:19 AM(%X 代表时分秒)
      print(time.strftime("%Y-%m-%d %H:%M:%S %p"))  # 2020-12-21 11:00:19 AM AM
      
      res = time.strftime("%Y-%m-%d %H:%M:%S %p",time.localtime())
      print(res)  # 2020-12-21 11:00:19 AM (第二个参数填写的是"结构化时间", 默认就是当前时间的结构化时间)
      res2 = time.strftime("%Y-%m-%d %H:%M:%S %p",time.gmtime(16545.5163))
      print(res2) # 1970-01-01 04:35:45 AM
      
      # "format time" 转换 "struct_time"
      print(time.strptime('2020-12-18 10:58:22 AM','%Y-%m-%d %H:%M:%S %p'))
      # 第一个参数是格式化字符串时间,第二个参数是对应的格式,必须一一对应,不然报错, 得到的是struct_time元组
      '''
      time.struct_time(tm_year=2020, tm_mon=12, tm_mday=18, tm_hour=10, tm_min=58, tm_sec=22, tm_wday=4, tm_yday=353, tm_isdst=-1)
      '''
      print(time.strptime('1970-01-01 04:35:45 AM','%Y-%m-%d %H:%M:%S %p'))
      '''
      time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=4, tm_min=35, tm_sec=45, tm_wday=3, tm_yday=1, tm_isdst=-1)
      '''
      
  • 我们需要掌握的就是格式化的字符串时间时间戳之间的转换

    import time
    
    # "format time" 与 "timestamp" 转换
    res = '2020-12-21 11:01:47 AM'        # 当前时间字符串
    struct_time = time.strptime(res,'%Y-%m-%d %H:%M:%S %p')  # 先转成格式化字符, 格式必须一一对应
    timestamp = time.mktime(struct_time)  # 再转成时间戳
    print(timestamp)  # 1608519707.0
    
    # 时间加减, 以当前时间戳为起始来计算
    res2 = timestamp + 24*3600  # 一天之后时间戳
    print(res2)  # 1608606107.0
    res3 = timestamp - 24*3600  # 一天之前时间戳
    print(res3)  # 1608433307.0
    
    # 将加减之后的"时间戳"转换成"format time"
    struct_time = time.localtime(res2)  # 先转换成格式化时间
    format_time = time.strftime("%Y-%m-%d %X %p",struct_time)  # 再转换成格式化时间字符串
    print(format_time)  # 2020-12-22 11:01:47 AM (一天之后的时间)
    
    struct_time = time.localtime(res3)
    format_time = time.strftime("%Y-%m-%d %X %p",struct_time)
    print(format_time)  # 2020-12-20 11:01:47 AM (一天之前的时间)
    
    

time模块其他常用方法

time.sleep(n)
  • 推迟指定的时间 (单位秒) 之后继续运行, 我们通常戏称睡多少秒之后
  • **一般做爬虫的时候需要有用。**这个时候不是效率越来越高越好,效率越来越高,把别人的网站会干死。还有就是破解账号与密码的时候如果你是机器输入账号密码非常快。这么快,所以要time.sleep模仿人正常输入密码的那种事情,因为它会监测任正快速密码,还有一定的时间间隔,不可能一下就完成。
import time
time.sleep(3) 

另外一种:结构化时间与时间戳转换成格式化字符串时间形式(了解)

img

1.asctime( )

  • 把一个表示时间的元组或者 struct_time 表示为: “Sun Jun 20 23:21:05 1993” 这种形式
  • 如果没有参数传入, 则默认传入 time.localtime()
import time

print(time.asctime())  # Mon Dec 21 10:45:44 2020
print(time.asctime(time.localtime()))  # Mon Dec 21 10:45:44 2020

2.ctime( )

  • 把一个时间戳(按秒计算的浮点数) 转换为: “Sun Jun 20 23:21:05 1993” 这种形式
  • 如果没有传入参数, 则默认传入time.time()
  • 作用等同于 : time.asctime(time.localtime(n)), “n” 表示秒
import time

print(time.ctime())  # Mon Dec 21 10:44:48 2020
print(time.ctime(time.time()))  # Mon Dec 21 10:44:48 2020
print(time.ctime(5456161.56456))  # Thu Mar  5 11:36:01 1970

ps : 在 Linux 系统上这种格式比较常见, 等同于: time.strftime('%b %a %d %X %Y')

二、datetime模块

1.datetime的主要作用

  • 时间加减运算:datetime真正的强大之处在于,你可以在他原本的时间结构上参与时间的运算。而time只有时间戳的基础之上才能进行运算, 对于’2020-12-21 11:11:11’类型的格式的显示, 互相转换之间繁琐, 需要从 时间戳 -> 结构化时间 -> 格式化字符串时间.

2.time 模块与 datetime 模块的不同点

  • datetime 可以在原本的时间结构上参与时间的运算
  • time 只有在时间戳的基础上才能进行运算, 运算之后在进行格式之间的转换

3.常用功能介绍

  • datetime.now( ) : 统计当前时间
# 1. datetime.now() 统计当前时间
import datetime
print(datetime.datetime.now())  # 2020-12-21 10:40:09.668120

#2. 本地时间与时间标准时间
import datetime

print(datetime.datetime.now())    # 2020-12-21 10:36:19.994004 (本地时间)
print(datetime.datetime.utcnow()) # 2020-12-21 02:36:19.994004 (世界标准时间)
  • date.fromtimestamp( ) : 将时间戳直接转成格式化字符串的时间
import datetime

print(datetime.date.fromtimestamp(5465564.564))  # 1970-03-05
print(datetime.date.fromtimestamp(time.time()))  # 2020-12-21
  • timedelta( ) : 主要用来统计时间间隔并与时间进行加减运算。(提示: 没有年份单位上的运算)
import datetime

print(datetime.datetime.now() + datetime.timedelta(-2))  # 两天前,不写关键字默认"day"
print(datetime.datetime.now() + datetime.timedelta(days=-2))     # 两天前
print(datetime.datetime.now() + datetime.timedelta(weeks=3))     # 三星期后
print(datetime.datetime.now() + datetime.timedelta(hours=-3))    # 三小时前
print(datetime.datetime.now() + datetime.timedelta(seconds=10))  # 十秒后
print(datetime.datetime.now() + datetime.timedelta(minutes=10))  # 十分钟后
print(datetime.datetime.now() + datetime.timedelta(minutes=10, seconds=30)) # 十分钟30秒后
  • replace( ) : 时间替换 (将当前时间替换成你指定的时间)
import datetime

now_time = datetime.datetime.now()
print(now_time)                                      # 2020-12-21 10:43:25.429961

print(now_time.replace(minute=00,hour=00,second=00)) # 2020-12-21 00:00:00.429961
print(now_time.replace(day=11,month=11,year=1111))   # 1111-11-11 10:43:25.429961

相关文章:

  • python之random模块
  • python之os模块
  • shutil模块
  • shelve 模块
  • typing模块
  • 压缩zipfile与解压缩tarfile模块
  • pyecharts 模块的简单使用
  • hashlib 与 hmac 模块
  • python之包
  • python之logging模块详解
  • logging模块基本介绍及使用
  • 面向对象的由来
  • python之面向对象编程
  • 类的封装
  • 类的多继承下的菱形问题
  • 《剑指offer》分解让复杂问题更简单
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CODING 缺陷管理功能正式开始公测
  • CSS 专业技巧
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • laravel5.5 视图共享数据
  • nodejs实现webservice问题总结
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 前端存储 - localStorage
  • 前端设计模式
  • 前端知识点整理(待续)
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 自定义函数
  • 自动记录MySQL慢查询快照脚本
  • linux 淘宝开源监控工具tsar
  • 阿里云ACE认证之理解CDN技术
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 数论-逆元
  • (11)MATLAB PCA+SVM 人脸识别
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)linux使用docker容器运行mysql
  • (三)uboot源码分析
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .form文件_一篇文章学会文件上传
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET处理HTTP请求
  • @31省区市高考时间表来了,祝考试成功
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [14]内置对象
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [ARM]ldr 和 adr 伪指令的区别
  • [autojs]逍遥模拟器和vscode对接
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]