随心所欲地用Python处理时间(1&2&3)
共 2084字,需浏览 5分钟
·
2021-10-09 15:03
datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。
学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分。
import time
time.time()
1625483470.3409266
二、datetime.date类
1、date类介绍
import datetime
t = datetime.date(2019,8,26)
print(type(t))
print(t.day,t.month,t.year) #
26 8 2019
from datetime import date
print(dir(date))
['ctime', 'day', 'fromisocalendar', 'fromisoformat', 'fromordinal',
'fromtimestamp', 'isocalendar', 'isoformat', 'isoweekday', 'max',
'min', 'month', 'replace', 'resolution', 'strftime', 'timetuple',
'today', 'toordinal', 'weekday', 'year']
2、类方法
date.today()
from datetime import date
date.today()
datetime.date(2021, 7, 4)
date.fromtimestamp()
from datetime import date
date.fromtimestamp(1339119900000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromtimestamp(1339120800000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromordinal()
from datetime import date
d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
d
datetime.date(2002, 3, 11)
date.fromisoformat()
from datetime import date
date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
d.isoformat()
'2002-03-11'
date.fromisocalendar()
date.fromisocalendar(2021, 42, 3)
datetime.date(2021, 10, 20)
date.min
from datetime import date
date.min
datetime.date(1, 1, 1)
date.max
from datetime import date
date.max
datetime.date(9999, 12, 31)
date.resolution
from datetime import date
date.resolution
datetime.timedelta(days=1)
date.year
from datetime import date
d = date.today()#生成一个date对象
d
datetime.date(2021, 7, 5)
d.year
2021
date.month
#接上述案例
d.month
7
date.day
#接上述案例
d.day
5
3、实例方法
date.replace()
from datetime import date
d = date(2002, 12, 31)
d.replace(day=26)
datetime.date(2002, 12, 26)
date.timetuple()
d = date(2002, 12, 31)
date.timetuple(d)
time.struct_time(tm_year=2002, tm_mon=12, tm_mday=31,
tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=365,
tm_isdst=-1)
date.toordinal()
d = date(1, 1, 1)
d.toordinal()
1
d = date(2002, 12, 31)
d.toordinal()
731215
date.fromordinal(d.toordinal())
datetime.date(2002, 12, 31)
date.weekday()
date(2002, 12, 4).weekday()
2
date.isoweekday()
date(2002, 12, 4).isoweekday()
3
date.isocalendar()
from datetime import date
date(2003, 12, 29).isocalendar()
(2004, 1, 1) # 旧版本
datetime.IsoCalendarDate(year=2004, week=1, weekday=1) # 新版本
date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
date.isoformat()
from datetime import date
date(2021, 10, 1).isoformat()
'2021-10-01'
date.__str__()
from datetime import date
date(2021, 10, 1).__str__()
'2021-10-01'
str(date(2021, 10, 1))
'2021-10-01'
date.ctime()
from datetime import date
date(2021, 10, 1).ctime()
'Fri Oct 1 00:00:00 2021'
d=date(2021, 10, 1)
import time
time.ctime(time.mktime(d.timetuple()))
'Fri Oct 1 00:00:00 2021'
date.strftime()
import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.strftime("%Y-%m-%d")
'2021-10-01'
dt.strftime("%Y年%m月%d日")
'2021年10月01日'
dt.strftime("%Y//%m//%d")
'2021//10//01'
dt.strftime("%Y-%m-%d %H:%M")
'2021-10-01 00:00'
dt.strftime("%A, %d. %B %Y %I:%M%p")
'Friday, 01. October 2021 12:00AM'
date.__format__(format)
import datetimedt=datetime.date(2021, 10, 1)#创建一个日期对象dt.__format__("%Y年%m月%d日")'2021年10月01日'
4、支持的运算
三、datetime.time类
1、time类概述
作用:一个 time 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。
语 法:
datetime.time(hour=0, minute=0, second=0, microsecond=0,
tzinfo=None, *, fold=0)
参 数:
所有参数都是可选的,tzinfo 可以是 None,或者是一个 tzinfo 子类的实例。 其余的参数必须是在下面范围内的整数:
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]
如果给出一个此范围以外的参数,则会引发 ValueError。 所有参数值默认为 0,只有 tzinfo 默认为 None。
通过内置函数dir,可以查看time类的所有方法和属性
from datetime import time
print(dir(time))
['dst', 'fold', 'fromisoformat', 'hour', 'isoformat', 'max',
'microsecond', 'min', 'minute', 'replace', 'resolution',
'second', 'strftime', 'tzinfo', 'tzname', 'utcoffset']
2、time类属性
time.min
早最的可表示 time, time(0, 0, 0, 0)。
from datetime import time
time.min
datetime.time(0, 0)
time.max
最晚的可表示 time, time(23, 59, 59, 999999)。
from datetime import time
time.max
datetime.time(23, 59, 59, 999999)
time.resolution
两个不相等的 time 对象之间可能的最小间隔,timedelta(microseconds=1),但是请注意 time 对象并不支持算术运算。
from datetime import time
time.resolution
datetime.timedelta(microseconds=1)
3、time类实例属性
time.hour
取值范围是 range(24)。
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.hour
12
time.minute
取值范围是 range(60)。
t.minute
34
time.second
取值范围是 range(60)。
t.second
56
time.microsecond
取值范围是 range(1000000)。
t.microsecond
123456
time.tzinfo
作为 tzinfo 参数被传给 time 构造器的对象,如果没有传入值则为 None。
t.tzinfo
time.fold
取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。
t.fold
0
4、time类实例方法
time.replace()
作用:返回一个具有同样属性值的 time,除非通过任何关键字参数指定了某些属性值。
语法:time.replace(hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.replace(hour=23, minute=12,)
datetime.time(23, 12, 56, 123456)
time.isoformat()
作用:返回表示为 ISO 8601 格式之一的时间字符串
语法:time.isoformat(timespec='auto')
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.isoformat()
'12:34:56.123456'
t.isoformat(timespec='minutes')
'12:34'
dt = time(hour=12, minute=34, second=56, microsecond=0)
dt.isoformat(timespec='microseconds')
'12:34:56.000000'
dt.isoformat(timespec='auto')
'12:34:56'
time.fromisoformat()
作用:返回对应于 time.isoformat() 所提供的某种 time_string 格式的 time。 特别地,此函数支持以下格式的字符串:HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
语法:time.fromisoformat(time_string)
time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
time.fromisoformat('04:23:01+04:00')
datetime.time(4,23,1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
time.__str__()
作用:对于时间对象 t, str(t) 等价于 t.isoformat()
语法:time.__str__(t)
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
time.__str__(t)
'12:34:56.123456'
str(t)
'12:34:56.123456'
time.strftime()
作用:时间->字符串,返回一个由显式格式字符串所指明的代表时间的字符串
语法:time.strftime(format)
from datetime import time
t = time(hour=12, minute=3, second=56)
t.strftime('%H:%M:%S')
#用:分隔
'12:03:56'
#用%分隔
t.strftime('%H%%%M%%%S')
'12%03%56'
time.__format__()
作用:与 time.strftime() 相同
语法:time.__format__(format)
from datetime import time
t = time(hour=12, minute=3, second=56)
t.__format__('%H:%M:%S')
'12:03:56'
t.__format__('%H%%%M%%%S')
'12%03%56'
time.utcoffset()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.utcoffset(None),并且在后者不返回 None 或一个幅度小于一天的 a timedelta 对象时将引发异常。
time.dst()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.dst(None),并且在后者不返回 None 或者一个幅度小于一天的 timedelta 对象时将引发异常。
time.tzname()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.tzname(None),如果后者不返回 None 或者一个字符串对象则将引发异常。
from datetime import time, tzinfo, timedelta
class TZ1(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=1)
def dst(self, dt):
return timedelta(0)
def tzname(self,dt):
return "+01:00"
def __repr__(self):
return f"{self.__class__.__name__}()"
t = time(12, 10, 30, tzinfo=TZ1())
t
datetime.time(12, 10, 30, tzinfo=TZ1())
t.isoformat()
'12:10:30+01:00'
t.dst()
datetime.timedelta(0)
t.tzname()
'+01:00'
t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
··· END ···