python时间模块 datetime (datetime、timedelta和timezone部分)

本文承接前文:https://blog.csdn.net/weixin_44013214/article/details/103116581
本文介绍时间模块datetime的剩余部分的内容

datetime类

datetime类是一个单独的类,包含了date类和time类的所有方法和属性,可以看成是date类和time类的组合

class datetime.datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0,
tzinfo=None,*,fold=0)
:对于datetime对象,参数year,month,day是必须有的,其他参数是可选的.
参数范围

参数范围
year[datetime.MINYEAR, datetime.MAXYEAR]
month[1, 12]
day1–28,29,30,31(根据实际年份月份确定)
hour[0, 24)
minute[0, 60)
second[0, 60)
microsecond[0, 1000000)
类方法(classmethod)

datetime.today()

  • 作用:返回一个无tzinfo的当前日期时间的datetime对象

datetime.now(tz=None)

  • 作用:返回一个当前日期时间的datime对象,若tz=None,则和datetime.today()一样的结果;同时,设置参数tz的值必须是timezone对象或者是基于tzinfo的类对象。
from datetime import datetime,timezone,timedelta
datetime.today()
# datetime.datetime(2019, 11, 19, 10, 15, 6, 361685)
datetime.now()
# datetime.datetime(2019, 11, 19, 10, 15, 15, 876817)
datetime.now(tz=timezone(timedelta(seconds=14400))
# datetime.datetime(2019, 11, 21, 5, 27, 14, 794799, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

datetime.utcnow()

  • 作用:返回一个无tzinfo的UTC时区的日期时间.
datetime.utcnow()
# datetime.datetime(2019, 11, 21, 4, 6, 41, 56739)

datetime.fromtimestamp(timestamp, tz=None)

  • 作用:将一个时间戳转化为一个datetime对,可以根据需要设置tz参数来设置时区信息
  • 参数timestamp: 时间戳 ; 参数tz: 时区信息,tzinfo对象

datetime.utcfromtimestamp(timestamp)

  • 作用:将时间戳转化为UTC时区 的datetime对象
  • 参数 timestamp:时间戳
import time
from datetime import datetime, timezone, timedelta
datetime.fromtimestamp(time.time())
# datetime.datetime(2019, 11, 21, 12, 17, 5, 313839)
datetime.fromtimestamp(time.time(), tz=timezone(timedelta(hours-8)))
# datetime.datetime(2019, 11, 21, 12, 13, 46, 926916, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
# datetime.utcfromtimestamp(time.time())
# datetime.datetime(2019, 11, 21, 4, 32, 5, 891002)

datetime.fromordinal(ordinal)

  • 作用:将一个相对于公元1年1月1日的序数,转化为对应的datetime对象,datetime对象的时间部分为0
  • 参数 ordinal:整数,对于datetime对象或date对象可通过datetime.toordinal(year, month, day)或date.toordinal(year, month, day)获得.
from datetime import date, datetime
d = date(2019, 11, 10)
dt = datetime(2019, 11, 11, 12, 12, 42)
d_ordinal = d.toordinal()
# d_ordinal = 737373
dt_ordinal = dt.toordinal()
# dt_ordinal = 737374
datetime.fromordinal(d_ordinal)
# datetime.datetime(2019, 11, 10, 0, 0)
datetime.fromordinal(dt_ordinal)
# datetime.datetime(2019, 11, 11, 0, 0)

datetime.combine(date, time, tzinfo=self.tzinfo)

  • 作用:将datetime.date对象和datetime.time对象合并成一个datetime对象.
  • 参数:
    - date:datetime.date对象
    - time:datetime.time对象
    - tzinfo:若有提供tzinfo参数则会使用该值;否则会使用time对象的tzinfo属性.
from datetime import date, time, datetime, timezone, timedelta
d = date(2019, 11, 21)
t = time(12, 52, 52, tzinfo=timezone(timedelta(hours=4)))
datetime.combine(d, t)
# datetime.datetime(2019, 11, 21, 12, 52, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
datetime.combine(d, t, tzinfo=timezone(timedelta(hours=8)))
# datetime.datetime(2019, 11, 21, 12, 52, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

datetime.strptime(date_string, format)

  • 作用:将指定格式的时间日期字符串转化为datetime对象
  • 参数
    - date_string:格式为参数format设置的日期时间字符串
    - format:格式设置字符
    等价于:datetime.datetime(*(time.time.strptime(date_string, format)[0:6]))
date_string = "2019-11-21 12:52:52"
format1 = "%Y-%m-%d %H:%M:%S"
datetime.strptime(date_string, format1)
# datetime.datetime(2019, 11, 21, 12, 52, 52)
类属性(class attributes)

datetime.min:返回 datetime.datetime(MINYEAR, 1, 1, tzinfo=None)
datetime.max:返回 datetime.datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
datetime.resolution:返回两个互不相等的datetime对象的最小差值,即
datetime.timedelta(microseconds=1)

from datetime import datetime
datetime.min
# datetime.datetime(1, 1, 1, 0, 0)
datetime.max
# datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
datetime.resolution
# datetime.timedelta(microseconds=1)
实例属性(instance attributes)
属性返回结果内容
datetime.year年份
datetime.month月份
datetime.day
datetime.hour小时
datetime.minute分钟
datetime.second
datetime.microsecond毫秒
datetime.tzinfo时区信息
实例方法(instance methods)

datetime.date():返回一个date对象,包含datetime对象的日期部分datetime.time():返回一个time对象,包含datetime对象的时间部分,不含tzinfo
datetime.timetz():返回一个time对象,包含datetime对象的时间部分,含tzinfo

from datetime import datetime, timezone, timedelta
dt =datetime(2019, 11, 21, 13, 29, 52, tzinfo=timezone(timedelta(hours=8)))
dt.date()
# datetime.date(2019, 11, 21)
dt.time()
# datetime.time(13, 29, 52)
dt.timetz()
# datetime.time(13, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

datetime.replace(year, month, day, hour, minute, second, microsecond, tzinfo)

  • 作用:通过传入相应的参数的值,改变datetime对象的对应值,返回一个全新的datetime对象(原datetime的值不会改变);若不传入值,则返回datetime的原值,
dt.replace()
# datetime.datetime(2019, 11, 21, 13, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
dt.replace(year=2018)
# datetime.datetime(2018, 11, 21, 13, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
dt  # 原值不改变
# datetime.datetime(2019, 11, 21, 13, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

datetime.astimezone(tz=None)

  • 作用:将datetime对象转化为对应的时区tz的日期时间,返回一个新的datetime对象。
  • 参数 tz:需要得到的时区;若为None,返回系统的所在的当前时区
from datetime import timezone, timedelta
dt = datetime(2019, 11, 21, 13, 29, 52, tzinfo=timezone(timedelta(hours=8)))  # 中国标准时间
dt2 = datetime(2019, 11, 21, 13, 29, 52, tzinfo=timezone.utc)  # UTC时区
dt.astimezone()
# datetime.datetime(2019, 11, 21, 13, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), '中国标准时间'))
dt2.astimezone(tz=timezone(timedelta(hours=8)))  # 将dt2转化为中国标准时间
# datetime.datetime(2019, 11, 21, 21, 29, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

datetime.timetuple()

  • 作用:将datetime对象转化为一个当前时区的时间元组(struct_time),返回一个time.struct_time对象

datetime.utctimetuple()

  • 作用:将datetime对象转化为一个UTC时区的时间元组(struct_time),返回一个time.struct_time()对象
dt.timetuple()
# time.struct_time(tm_year=2019, tm_mon=11, tm_mday=21, tm_hour=13, tm_min=29, tm_sec=52, tm_wday=3, tm_yday=325, tm_isdst=-1)
dt.utctimetuple()
# time.struct_time(tm_year=2019, tm_mon=11, tm_mday=21, tm_hour=5, tm_min=29, tm_sec=52, tm_wday=3, tm_yday=325, tm_isdst=0)

datetime.toordinal()

  • 作用:将datetime对象转化为相对于公元1年1月1日的序数
dt.toordinal()
# 737384

datetime.timestamp()

  • 作用:将datetime对象转化为对应的时间戳
dt.timestamp()
# 1574314192.0

datetime.weekday()

  • 作用:得到datetime对象所在一周中的第几天,范围:[0, 6]

datetime.isoweekday()

  • 作用:得到datetime对象所在ISO周中的第几天,范围:[1, 7]

datetime.isocalendar()

  • 作用:将datetime对象转化为一个元组类型(ISO year, ISO week number, ISO weekday).
dt.weekday()
# 3
dt.isoweekday()
# 4
dt.isocalendar()
# (2019, 47, 4)

datetime.isoformat(sep=‘T’, timespec=‘auto’)

  • 作用:将datetime对象转化为ISO格式的日期时间字符串
  • 参数:
    - sep:日期部分与时间部分的连接符,须是unicode 对象
    - timespec:时间部分显示的模式选择
timespecformat
auto根据time对象的时间内容,自动选择下面的模式
hoursHH
minutesHH:MM
secondsHH:MM:SS
microsecoondsHH:MM:SS.ffff
millisecondesHH:MM:SS.sss

:除了milliseconds,其他模式,若出现了时间偏移量offsetime,则需要加上偏移量

dt.isoformat(sep='-', timespec="auto")
# '2019-11-21-13:29:52+08:00'
dt.isoformat(sep='>', timespec="minutes")
# '2019-11-21>13:29+08:00'

datetime.utcoffset():根据datetime对象的tzinfo,返回与UTC时区的时间偏移量,为timedelta对象
datetime.dst():根据datetime对象的tzinfo,返回是否夏令时
datetime.tzname():根据datetime对象的tzinfo,返回时区名称

dt.utcoffset()
# datetime.timedelta(seconds=28800)
dt.dst()
# None
dt.tzname()
# 'UTC+08:00'

timedelta类

timedelta类表示一个时间间隔值,即两个日期或时间的时间差值
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
:所有参数都是可选的,可以是int或float类型的数值,也可以是蒸熟或者负数。同时,传入参数后,timedelta只会存储days,seconds,microseconds三个参数的内容,对其他参数,会进行相关的运算转化,如下:

  • 1 millisecond = 1000 microseconds
  • 1 minute = 60 seconds
  • 1 hour = 3600seconds
  • 1 week = 7days

days, seconds, microseconds参数的取值范围:

  • 0 <= microseconds < 1000000
  • 0 <= seconds < 3600*24 (一天的总秒数)
  • 999999999 <= days <= 999999999
from datetime import timedelta
timedelta(days=1, seconds=20, microseconds=232, milliseconds=999, minutes=2, hours=2, weeks=7)
# datetime.timedelta(days=50, seconds=7340, microseconds=999232)
timedelta(microseconds=-1)
# datetime.timedelta(days=-1, seconds=86399, microseconds=999999)
类属性(class atrributes)

timedelta.min:返回最小的负数timedelta对象,即timedelta(-999999999)
timedelta.max:返回最大的正数timedelta对象,即timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
timedelta.resolution:返回两个会不相等的timedelta对象的最小差值,即timedelta(microseconds=1)

实例属性(instance atrributes)
属性值范围
days[-999999999, 999999999]
seconds[0, 86399]
microseconds[0, 999999]
实例方法(instance methods)

timedelta.total_seconds()
- 作用:将timedelta对象转化为秒

td = timedelta(days=1, seconds=20, microseconds=232, milliseconds=999, minutes=2, hours=2, weeks=7)
td.total_seconds()
# 4327340.999232

timezone类

timezone类继承与基类tzinfo,它的每个实例都表示一个由UTC的固定偏移量定义的时区。
class datetime.timezone(offset, name=None)

参数说明
offsettimedelta类型,与UTC时区的时间间隔,范围:[-timedelta(hours=24), timedelta(hours=24)]
name可选参数,字符串类型,设置时区的名称,可以被datetime对象通过实例方法tzname()获取。

类属性

timezone.utc:表示为UTC时区,即timezone(timedelta(0))

from datetime import datetime, timezone, timedelta
tz1 = timezone(timedelta(hours=3), name='East 3')
dt = datetime(2019, 11, 21, 15, 12, 52, tzinfo = tz1)
# dt = datetime.datetime(2019, 11, 21, 15, 12, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=10800), 'East 3'))
dt.tzname()
# 'East 3'
timezone.utc
# datetime.timezone.utc

总结:

本文及前文只是对时间模块datetime 中的相关类的属性和方法进行介绍,datetime模块还可以进行相关的算术运算,可以参考python官方文档进行了解。

笔者水平有限,若有错误,欢迎评论指出。


版权声明:本文为weixin_44013214原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。