datetime日期和时间管理

news/2024/10/21 7:41:03/

datetime日期和时间管理

文章目录

  • datetime日期和时间管理
    • 1.概述
    • 2.时间time
      • 2.1.time类基本使用
        • 1.获取时间
        • 2.获取一天中合法时间范围
        • 3.time微妙是整数
    • 3.日期date
      • 3.1.date基本操作
        • 1.查看date获取日历信息
        • 2.时间戳转为日期格式
        • 3.日期合法范围
        • 4.replace创建日期
        • 5.date属性和方法
    • 4.时间计算timedelta
      • 4.1.timedelta基本使用
        • 1.查看timedelta类提供的时间信息
        • 2.转换完整的时间段
      • 4.2.日期算术
        • 1.timedelta计算日期
        • 2.timedelta与整数浮点数算术运算
      • 4.3.日期比较
    • 5.日期和时间datetime
      • 5.1.查看日期和时间
      • 5.2.datetime属性和方法
    • 6.格式化日期
    • 7.时区
      • 7.1.设置时区

1.概述

datetime包含 一些函数和类,用于完成日期和时间的解析,格式化和算术运算.
datetime通过模块将日期和时间做了分类,可以根据需求选择不同的模块,获取日期和时间方便按需使用。下面是模块划分和职责关系
datetime下包含的模块和职业

  • time模块获取时间
  • date模块获取日期
  • timedelta模块计算(日、时、分、秒、微秒、毫秒)日期
  • datetime模块在date和time上封装了操作时间的方法,方便操作日期和时间

2.时间time

时间值用time类表示,time类包含六个参数,分别为hour,minute,second,microsecond,tzinfo,fold,返回格式为hour:minute:second(.microsecond)。常用的参数有:hour、minute、second三个
time实例只包含时间值,不包含与时间关联的日期值。

2.1.time类基本使用

下面通过一些示例介绍使用time类实例对象调用属性获取时间相关操作。

1.获取时间

实例化time对象,并传入时间参数,输出所有时间字段。

t = datetime.time(1, 2, 3, 4)
print(t)
print('hour       :', t.hour)
print('minute     :', t.minute)
print('second     :', t.second)
print('microsecond:', t.microsecond)
print('tzinfo     :', t.tzinfo)

运行结果

1:02:03.000004
hour       : 1
minute     : 2
second     : 3
microsecond: 4
tzinfo     : None

2.获取一天中合法时间范围

min和max类属性可以反应一天中合法的时间范围

import datetimeprint('Earliest  :', datetime.time.min)
print('Latest    :', datetime.time.max)
print('Resolution:', datetime.time.resolution)

运行代码,结果展示了一天中合法时间范围最小值和最大值

Earliest  : 00:00:00
Latest    : 23:59:59.999999
Resolution: 0:00:00.000001

3.time微妙是整数

time的微妙被限制为整微妙,如果秒数为浮点数,则会产生一个TypeError异常。

import datetimefor m in [1, 0, 0.1, 0.6]:try:print('{:02.1f} :'.format(m),# 初始化time类,微秒参数为上面列表的值,当值为1和0整数时能够正确显示,如果是后面的0.1浮点数也会报错datetime.time(0, 0, 0, microsecond=m))except TypeError as err:print('ERROR:', err)

运行代码,初始化time实例,当微秒参数为浮点数时产生TypeError错误

1.0 : 00:00:00.000001
0.0 : 00:00:00
ERROR: 'float' object cannot be interpreted as an integer
ERROR: 'float' object cannot be interpreted as an integer

3.日期date

日历用date类表示,使用date实例属性year、month、和day属性可以单独获取相关日期信息。

3.1.date基本操作

1.查看date获取日历信息

下面的例子用不同的格式输出了日期

import datetimetoday = datetime.date.today()
print(today)
print('ctime  :', today.ctime())
tt = today.timetuple()
print('tuple  : tm_year  =', tt.tm_year)
print('         tm_mon   =', tt.tm_mon)
print('         tm_mday  =', tt.tm_mday)
print('         tm_hour  =', tt.tm_hour)
print('         tm_min   =', tt.tm_min)
print('         tm_sec   =', tt.tm_sec)
print('         tm_wday  =', tt.tm_wday)
print('         tm_yday  =', tt.tm_yday)
print('         tm_isdst =', tt.tm_isdst)
print('ordinal:', today.toordinal())
print('Year   :', today.year)
print('Mon    :', today.month)
print('Day    :', today.day)

运行结果

2023-02-10
ctime  : Fri Feb 10 00:00:00 2023
tuple  : tm_year  = 2023tm_mon   = 2tm_mday  = 10tm_hour  = 0tm_min   = 0tm_sec   = 0tm_wday  = 4tm_yday  = 41tm_isdst = -1
ordinal: 738561
Year   : 2023
Mon    : 2
Day    : 10

2.时间戳转为日期格式

import datetime
import timeo = 733114
print('o               :', o)
# 公历日期时间戳转为日期
print('fromordinal(o)  :', datetime.date.fromordinal(o))t = time.time()
print('t               :', t)
# 根据给定的时间戮,返回一个date对象
print('fromtimestamp(t):', datetime.date.fromtimestamp(t))

运行结果

o               : 733114
fromordinal(o)  : 2008-03-13
t               : 1675995288.686629
fromtimestamp(t): 2023-02-10

3.日期合法范围

查看日期最小值和最大值合法范围

import datetimeprint('Earliest  :', datetime.date.min)
print('Latest    :', datetime.date.max)
print('Resolution:', datetime.date.resolution)

运行结果

Earliest  : 0001-01-01
Latest    : 9999-12-31
Resolution: 1 day, 0:00:00

4.replace创建日期

import datetimed1 = datetime.date(2008, 3, 29)
print('d1:', d1.ctime())d2 = d1.replace(year=2009)
print('d2:', d2.ctime())

运行结果

d1: Sat Mar 29 00:00:00 2008
d2: Sun Mar 29 00:00:00 2009

5.date属性和方法

import datetimetoday = datetime.date(year=2020,month=8,day=31)   #  使用参数创建日期print('date对象的年份:', today.year)    print('date对象的月份:', today.month)   print('date对象的日:', today.day)  print("date对象的struct_time结构为:",today.timetuple())print("返回当前公历日期的序数:",today.toordinal())   #  与fromordinal函数作用相反print("当前日期为星期(其中:周一对应0):{}".format(today.weekday()))print("当前日期为星期(其中:周一对应1):{}".format(today.isoweekday()))print("当前日期的年份、第几周、周几(其中返回为元组):",today.isocalendar())print("以ISO 8601格式‘YYYY-MM-DD’返回date的字符串形式:",today.isoformat())print("返回一个表示日期的字符串(其格式如:Mon Aug 31 00:00:00 2020):",today.ctime())print("指定格式为:",today.strftime("%Y/%m/%d"))print("替换后的日期为:",today.replace(2019,9,29))

运行结果

date对象的年份: 2020
date对象的月份: 8
date对象的日: 31
date对象的struct_time结构为: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=244, tm_isdst=-1)
返回当前公历日期的序数: 737668
当前日期为星期(其中:周一对应0):0
当前日期为星期(其中:周一对应1):1
当前日期的年份、第几周、周几(其中返回为元组): datetime.IsoCalendarDate(year=2020, week=36, weekday=1)
以ISO 8601格式‘YYYY-MM-DD’返回date的字符串形式: 2020-08-31
返回一个表示日期的字符串(其格式如:Mon Aug 31 00:00:00 2020): Mon Aug 31 00:00:00 2020
指定格式为: 2020/08/31
替换后的日期为: 2019-09-29

4.时间计算timedelta

  • 使用timedelta可以很方便的在日期上做天days,小时hour,分钟minute,秒second,毫秒millisecond,微妙的时间计算microsecond。如果要进行年、月的加减,则需要另外的办法
  • timedelta类的使用,一定要结合date类的对象 或 datetime类的对象使用。也就是说,一定是基于这两个类的对象,进行时间的加、减。
  • 将两个日期相减可以生成一个timedelta,还可以对某个日期增加或减去一个timedelta生成另一个日期。
  • timedelta内部日期按照日、秒、微秒存储

4.1.timedelta基本使用

1.查看timedelta类提供的时间信息

下面的例子演示了timedelta类可以输出的时间信息,包含天days,小时hour,分钟minute,秒second,毫秒millisecond,微妙的时间

import datetimeprint('microseconds:', datetime.timedelta(microseconds=1))
print('milliseconds:', datetime.timedelta(milliseconds=1))
print('seconds     :', datetime.timedelta(seconds=1))
print('minutes     :', datetime.timedelta(minutes=1))
print('hours       :', datetime.timedelta(hours=1))
print('days        :', datetime.timedelta(days=1))
print('weeks       :', datetime.timedelta(weeks=1))

运行结果

microseconds: 0:00:00.000001
milliseconds: 0:00:00.001000
seconds     : 0:00:01
minutes     : 0:01:00
hours       : 1:00:00
days        : 1 day, 0:00:00
weeks       : 7 days, 0:00:00

2.转换完整的时间段

使用total_seconds方法可以将给定的时间转换成完整的秒数。

import datetimefor delta in [datetime.timedelta(microseconds=1),datetime.timedelta(milliseconds=1),datetime.timedelta(seconds=1),datetime.timedelta(minutes=1),datetime.timedelta(hours=1),datetime.timedelta(days=1),datetime.timedelta(weeks=1),]:print('{:15} = {:8} seconds'.format(str(delta), delta.total_seconds()))

运行结果等号左边是给定的时间,右边是转换成秒数。

0:00:00.000001  =    1e-06 seconds
0:00:00.001000  =    0.001 seconds
0:00:01         =      1.0 seconds
0:01:00         =     60.0 seconds
1:00:00         =   3600.0 seconds
1 day, 0:00:00  =  86400.0 seconds
7 days, 0:00:00 = 604800.0 seconds

4.2.日期算术

1.timedelta计算日期

日期算术使用标准算术操作符完成,下面的例子展示了使用timedelta对象计算新日期,另外将日期实例相减生成timedelta

import datetimetoday = datetime.date.today()
print('Today    :', today)one_day = datetime.timedelta(days=1)
print('One day  :', one_day)yesterday = today - one_day
print('Yesterday:', yesterday)tomorrow = today + one_day
print('Tomorrow :', tomorrow)print()
print('tomorrow - yesterday:', tomorrow - yesterday)
print('yesterday - tomorrow:', yesterday - tomorrow)

运行结果

Today    : 2023-02-10
One day  : 1 day, 0:00:00
Yesterday: 2023-02-09
Tomorrow : 2023-02-11tomorrow - yesterday: 2 days, 0:00:00
yesterday - tomorrow: -2 days, 0:00:00

2.timedelta与整数浮点数算术运算

timedelta对象还支持整数、浮点数、和其他timedelta实例运算,下面的例子展示了timedelta算术运算结果。

mport datetimeone_day = datetime.timedelta(days=1)
print('1 day    :', one_day)
print('5 days   :', one_day * 5)
print('1.5 days :', one_day * 1.5)
print('1/4 day  :', one_day / 4)# assume an hour for lunch
work_day = datetime.timedelta(hours=7)
meeting_length = datetime.timedelta(hours=1)
print('meetings per day :', work_day / meeting_length)

运行结果

1 day    : 1 day, 0:00:00
5 days   : 5 days, 0:00:00
1.5 days : 1 day, 12:00:00
1/4 day  : 6:00:00
meetings per day : 7.0

4.3.日期比较

日期和时间都可以使用标准操作符比较哪个在前哪个在后

import datetime
import timeprint('Times:')
t1 = datetime.time(12, 55, 0)
print('  t1:', t1)
t2 = datetime.time(13, 5, 0)
print('  t2:', t2)
print('  t1 < t2:', t1 < t2)print()
print('Dates:')
d1 = datetime.date.today()
print('  d1:', d1)
d2 = datetime.date.today() + datetime.timedelta(days=1)
print('  d2:', d2)
print('  d1 > d2:', d1 > d2)

运行结果,下面的例子展示了对比时间和日期

Times:t1: 12:55:00t2: 13:05:00t1 < t2: TrueDates:d1: 2023-02-10d2: 2023-02-11d1 > d2: False

5.日期和时间datetime

datetime类由日期和时间构成,提供了更多遍历的方法操作日期和时间。

5.1.查看日期和时间

import datetimeprint("现在的时间是:",datetime.datetime.today())print("返回现在的时间是:",datetime.datetime.now())print("当前UTC日期和时间是:",datetime.datetime.utcnow())print("对应时间戳的日期和时间是:",datetime.datetime.fromtimestamp(1234567896))print("对应UTC时间戳的日期和时间是:",datetime.datetime.utcfromtimestamp(1234567896))print("公历序列对应的日期和时间是:",datetime.datetime.fromordinal(1))print("日期和时间的合体为:",datetime.datetime.combine(datetime.date(2020, 8, 31), datetime.time(12, 12, 12)))

运行结果

现在的时间是: 2023-02-10 11:34:12.664558
返回现在的时间是: 2023-02-10 11:34:12.664572
当前UTC日期和时间是: 2023-02-10 03:34:12.664578
对应时间戳的日期和时间是: 2009-02-14 07:31:36
对应UTC时间戳的日期和时间是: 2009-02-13 23:31:36
公历序列对应的日期和时间是: 0001-01-01 00:00:00
日期和时间的合体为: 2020-08-31 12:12:12

5.2.datetime属性和方法

import datetimenow = datetime.datetime(2020,8,31,12,10,10)print("年为:",now.year)print("月为:",now.month)print("日为:",now.day)print("小时为:",now.hour)print("分钟为:",now.minute)print("秒数为:",now.second)print('当前日期为:', now.date() )print('当前时间:', now.time() )print("返回struct_time为",now.timetuple())   #  和date一样print("返回UTC的struct_time为",now.utctimetuple())print("返回的公历序列数为:",now.toordinal())   #  和date一样print("返回标准日期格式为:",now.isoformat())   #  和date一样print("返回的周几(1表示周一):",now.isoweekday())    #  和date一样print("返回的周几(0表示周一):",now.weekday())    #  和date一样  print("now.isocalendar():", now.isocalendar())  #  和date一样print("now.ctime():",now.ctime())   #  和date一样print("格式化时间为:",now.strftime('%Y/%m/%d %H:%M:%S'))   #  把日期按照format指定的格式进行格式化print(datetime.datetime.strptime("2020/12/29 8:8:00",'%Y/%m/%d %H:%M:%S')) 

运行结果

年为: 2020
月为: 8
日为: 31
小时为: 12
分钟为: 10
秒数为: 10
当前日期为: 2020-08-31
当前时间: 12:10:10
返回struct_time为 time.struct_time(tm_year=2020, tm_mon=8, tm_mday=31, tm_hour=12, tm_min=10, tm_sec=10, tm_wday=0, tm_yday=244, tm_isdst=-1)
返回UTC的struct_time为 time.struct_time(tm_year=2020, tm_mon=8, tm_mday=31, tm_hour=12, tm_min=10, tm_sec=10, tm_wday=0, tm_yday=244, tm_isdst=0)
返回的公历序列数为: 737668
返回标准日期格式为: 2020-08-31T12:10:10
返回的周几(1表示周一)1
返回的周几(0表示周一)0
now.isocalendar(): datetime.IsoCalendarDate(year=2020, week=36, weekday=1)
now.ctime(): Mon Aug 31 12:10:10 2020
格式化时间为: 2020/08/31 12:10:10
2020-12-29 08:08:00

6.格式化日期

datetime对象默认字符串表示使用ISO-8601格式(YYYY-MM-DDTHH:MM:SS.mmmmm),可以使用strftime生成其他格式。
使用datetime.strptime()可以将格式化的字符串转换为datetime实例

import datetimeformat = "%a %b %d %H:%M:%S %Y"today = datetime.datetime.today()
print('ISO     :', today)s = today.strftime(format)
print('strftime:', s)d = datetime.datetime.strptime(s, format)
print(d)
print('strptime:', d.strftime(format))

运行结果

ISO     : 2023-02-10 14:49:00.740146
strftime: Fri Feb 10 14:49:00 2023
2023-02-10 14:49:00
strptime: Fri Feb 10 14:49:00 2023

7.时区

在datetime中时区由tzinfo的子类表示。由于tzinfo是一个抽象基类,实际使用时,应该定义一个它的子类,并为一些方法提供实现。
datetime在timezone类中包含了一个原生的实,该类使用了一个UTC 偏移,这个实现不支持一年中不同日期有不同的偏移值,如有些地方采用夏令时,或者有些地方UTC偏移会随时间改变。

7.1.设置时区

1.获取当前的本地日期和UTC日期

from datetime import timezone, timedelta, datetime
utc_time = datetime.utcnow()  # utcnow()获取世界标准时间。
print(f'1、UTC时间为:{utc_time}')local_time = datetime.now()  # now() 获取本地时间。
print(f'1、本地时间为:{local_time}')

运行结果

1、UTC时间为:2023-02-10 07:15:53.490433
1、本地时间为:2023-02-10 15:15:53.490719
  1. timezone() 设置时区对象,时区偏移值由 timedelta() 提供。
# 通过timezone 设置时区:可以看出定义的时区都是在 UTC时区 基础上进行的 加或减 操作
beijing = timezone(timedelta(hours=8))
print(f'1、北京时区为:{beijing}')Tokyo = timezone(timedelta(hours=9))
print(f'2、东京时区为:{Tokyo}')New_York = timezone(timedelta(hours=-4))
print(f'3、纽约时区为:{New_York}')utc = timezone.utc
print(f'4、世界标准时区为:{utc}')

运行代码,查看设置的时区对象

1、北京时区为:UTC+08:00
2、东京时区为:UTC+09:00
3、纽约时区为:UTC-04:00
4、世界标准时区为:UTC

3.astimezone() 修改时区

# 在 UTC 的时间基础上,用 astimezone() 修改时区
utc_time = datetime.utcnow()  # 获取当前 UTC 时间
print(f'UTC时间为:{utc_time}')
local_time = datetime.now()  # 获取当前本地时间
print(f'本地时间为:{local_time}')utc = timezone.utc  # 获取 UTC 的时区对象
utc_time = datetime.utcnow().replace(tzinfo=utc)  # 强制转换加上 UTC 时区。此处敲黑板,需要特别注意。
# replace的tzinfo参数为时区对象,所以
# 也可以这样 replace(tzinfo=timezone(timedelta(hours=0))
print(f'1、强制更改后的UTC时间为:{utc_time}')time_beijing = utc_time.astimezone(beijing)
time_newyork = utc_time.astimezone(New_York)
time_tokyo = utc_time.astimezone(Tokyo)
print('2、更改时区为北京后的时间:', time_beijing)
print('3、获取时区信息:', time_beijing.tzinfo)
print('4、更改时区为东京后的时间:', time_tokyo)
print('5、获取时区信息:', time_tokyo.tzinfo)
print('6、更改时区为纽约后的时间:', time_newyork)
print('7、获取时区信息:', time_newyork.tzinfo)

运行代码,修改时区时间

UTC时间为:2023-02-10 07:15:53.490758
本地时间为:2023-02-10 15:15:53.490767
1、强制更改后的UTC时间为:2023-02-10 07:15:53.490772+00:00
2、更改时区为北京后的时间: 2023-02-10 15:15:53.490772+08:00
3、获取时区信息: UTC+08:00
4、更改时区为东京后的时间: 2023-02-10 16:15:53.490772+09:00
5、获取时区信息: UTC+09:00
6、更改时区为纽约后的时间: 2023-02-10 03:15:53.490772-04:00
7、获取时区信息: UTC-04:00

http://www.ppmy.cn/news/23977.html

相关文章

MES系统智能工厂,搭上中国制造2025顺风车

MES在电子制造业中的应用日益广泛&#xff0c;越来越多的厂商已经购置或自行开发了MES&#xff0c;并将其作为“智能化工厂”。国内大大小小、各行各业都有上百个MES系统&#xff0c;还有很多的国外MES系统&#xff0c;怎么才能在MES系统公司中找到适合自己的MES&#xff1f;希…

单片机开发---ESP32S3移植NES模拟器(二)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器&#xff08;一&#xff09;》 暖场视频&#xff0c;小时候称这个为—超级曲线射门&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

单链表--C语言版(从0开始,超详细解析,小白一看就会)

目录 一、前言 &#x1f34e; 为什么要学习链表 &#x1f4a6;顺序表有缺陷 &#x1f4a6; 优化方案&#xff1a;链表 二、链表详解 &#x1f350;链表的概念 &#x1f349;链表的结构组成&#xff1a;节点 &#x1f353;链表节点的连接&#xff08;逻辑结构与物理结构的区…

HashMap设计思想学习

HashMap设计思想学习引言树化与退化红黑树的优势索引计算put流程扩容&#xff08;加载&#xff09;因子为何默认是 0.75fhashMap并发丢失数据问题jdk 1.7并发死链问题key 的设计引言 hashmap在jdk 1.7之前是数组链表结构&#xff0c;而jdk1.8之后变为是数组(链表|红黑树) 树化…

【直击招聘C++】2.5 this指针

2.5 this指针一、要点归纳1.什么是this指针2.this指针的深入讨论程序1程序23.类成员函数返回对象和返回对象引用的区别二、面试真题解析面试题1面试题2一、要点归纳 1.什么是this指针 this指针是隐含于每一个类对象的特殊指针&#xff0c;该指针值是一个正在被某个成员函数操作…

C++类和对象(下)

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 I do not believe in taking the right decision. I take a decision and make it right. 我不相信什么正确的决定。我都是先做决定&#xff0c;然后把…

零代码做分析报表的bi软件才是好软件

有些数据分析软件对IT的依赖比较重&#xff0c;在制作报表的过程中需要用到SQL&#xff0c;这就导致了IT人员懂技术不懂业务&#xff0c;业务人员懂业务不懂技术&#xff0c;数据分析做来做去总是差点什么的局面。要是遇到了IT部门相对较弱的情况&#xff0c;还会加重IT负担&am…

基于C#制作一个飞机大战小游戏

此文主要基于C#制作一个飞机大战游戏&#xff0c;重温经典的同时亦可学习。 实现流程1、创建项目2、界面绘制3、我方飞机4、敌方飞机5、子弹及碰撞检测实现流程 1、创建项目 打开Visual Studio&#xff0c;右侧选择创建新项目。 搜索框输入winform&#xff0c;选择windows窗体…