Python datetime.md
datetime模块包含了一些用于时间解析、格式化、计算的函数.
Times
时间值由time类来表示, Times有小时, 分, 秒和微秒属性. 以及包含时区信息. 初始化time实例的参数是可选的, 但这样的话, 你将获得初始值0(也许不是你所想要的).
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None):所有参数都是可选的。tzinfo可以是None或tzinfo子类的实例。
类属性:
time.min:可表示的最早的time,time(0, 0, 0, 0)。
time.max:可表示的最晚的time,time(23, 59, 59, 999999)。
time.resolution:不相等的time对象之间的最小可能差,即timedelta(microseconds=1),还要注意time不支持算术操作。
time.hour:在range(24)之间。
time.minute:在range(60)之间。
time.second:在range(60)之间。
time.microsecond:在range(1000000)之间。
time.tzinfo:作为tzinfo参数传递给time构造函数的对象,如果没有传递则为None。
举例
import datetimet = datetime.time(10, 20, 30)
print(t)
print('hour :', t.hour)
print('minute :', t.minute)
print('second :', t.second)
print('microsecond:', t.microsecond)
print('tzinfo :', t.tzinfo)
输出:
10:20:30hour : 10
minute : 20
second : 30
microsecond: 0
tzinfo : None
一个time实例只包含时间值, 不包含日期值.
print('Earliest :', datetime.time.min)print('Latest :', datetime.time.max)
print('Resolution :', datetime.time.resolution)
类属性中的最大最小值反应了一天中的时间范围.
输出:
Earliest : 00:00:00Latest : 23:59:59.999999
Resolution : 0:00:00.000001
实际中, 如果使用浮点型作为微秒参数, 那么将产生一些警告信息.
for m in [1, 0, 0.1, 0.6]: try:
print('{:02.1f} :'.format(m), datetime.time(0, 0, 0, microsecond=m))
except TypeError as err:
print('ERROR:', err)
输出:
1.0 : 00:00:00.0000010.0 : 00:00:00
ERROR: integer argument expected, got float
ERROR: integer argument expected, got float
Dates
日期值可以由date类来表示, 实例有年、月、日属性, 使用data类的 today() 方法可以方便的表示出今天的日期.
class datetime.date(year, month, day):所有的参数都是必须的。
classmethod date.today():返回当前本地的日期。这相当于date.fromtimestamp(time.time())。
classmethod date.fromtimestamp(timestamp):返回与POSIX时间戳对应的本地日期,例如time.time()返回的时间戳。如果时间戳超出平台C localtime()函数支持的值的范围则引发OverflowError,如果localtime()失败则引发OSError。通常限制年份在1970 到 2038之间。请注意,在时间戳中包含闰秒的非POSIX系统上,fromtimestamp()会忽略闰秒。
classmethod date.fromordinal(ordinal):返回对应于公历序数的日期,其中第一年的一月一日为序数1。如果不满足1 <= ordinal <= date.max.toordinal(),则引发ValueError。对于任何日期d,date.fromordinal(d.toordinal()) == d。
类属性:
date.min:可表示的最早日期,date(MINYEAR, 1, 1)。
date.max:可表示最晚的日期,date(MAXYEAR, 12, 31)。
date.resolution:不相等的日期对象之间的最小可能差异,timedelta(days=1)。
实例属性(只读):
date.year:在MINYEAR和MAXYEAR之间,包括这两个值。
date.month:在 1 到 12 之间,包括 1 和 12。
date.day:在 1 到给出的年份和月份之间的天数。
实例方法:
date.replace(year, month, day):依据关键字参数给出的新值,返回一个新的日期。例如,如果d == date(2002, 12, 31),那么d.replace(day=26) == date(2002, 12, 26)。
date.timetuple():返回一个time.struct_time,类似time.localtime()的返回值。Hours、minutes和seconds为0,DST标记为-1。d.timetuple()等同于time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1)),其中yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1当前年份中的天数,1月1日为开始的第1天。
date.toordinal():返回公历日期的序数,其中第1年的1月1日为第1天。对于任何date对象d,date.fromordinal(d.toordinal()) == d。
date.weekday():返回一星期中的第几天,其中星期一是0,星期日是6。例如,date(2002, 12, 4).weekday() == 2,是星期三。
date.isoweekday():返回一星期中的第几天,其中星期一是1,星期日是7。 例如,date(2002, 12, 4).isoweekday() == 3,是星期三。
date.isoformat():返回以ISO 8601 格式‘YYYY-MM-DD’表示日期的字符串。例如,date(2002, 12, 4).isoformat() == '2002-12-04'。
date.ctime():返回表示日期的字符串,例如date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'。在原生的C函数ctime()(time.ctime()调用它,但是date.ctime() 不调用它)遵守C标准的平台上,d.ctime()等效于time.ctime(time.mktime(d.timetuple()))。
date.strftime(format):返回一个表示日期的字符串,由显式的格式字符串控制。引用小时、分钟和秒的格式代码的值将为0。
举例
today = 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)
输出:
2017-07-02ctime : Sun Jul 2 00:00:00 2017
tuple : tm_year = 2017
tm_mon = 7
tm_mday = 2
tm_hour = 0
tm_min = 0
tm_sec = 0
tm_wday = 6
tm_yday = 183
tm_isdst = -1
ordinal: 736512
Year : 2017
Mon : 7
Day : 2
显示了函数 fromordinal() 和 fromtimestamp() 返回了不同的结果.
import datetimeimport time
o = 733114
print('o :', o)
print('fromordinal(o) :', datetime.datetime.fromordinal(o))
t = time.time()
print('t :', t)
print('fromtimestamp(t):', datetime.date.fromtimestamp(t))
输出:
o : 733114fromordinal(o) : 2008-03-13 00:00:00
t : 1499002982.592
fromtimestamp(t): 2017-07-02
对于一个存在的日期, 可使用replace函数可以创建出一个新的日期实例. 比如你可以改变年数, 只保留月份和日.
d1 = datetime.date(2012, 12, 31)print('d1:', d1)
print('d1:', d1.ctime())
d2 = d1.replace(year=2008)
print('d2:', d2)
print('d2:', d2.ctime())
输出:
d1: 2012-12-31d1: Mon Dec 31 00:00:00 2012
d2: 2008-12-31
d2: Wed Dec 31 00:00:00 2008
timedeltas
可以使用两个datetime对象的基本算法来计算未来和过去的日期,或者将一个datetime和一个时间增量组合在一起。减去日期产生一个时间增量,并且可以从一个日期中添加或减去一个时间增量来生成另一个日期。时间增量的内部值存储在几天、几秒和几微秒内。
class 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天。
类属性有:
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)。
实例属性(只读):
属性 | 值 |
---|---|
days | 介于-999999999和999999999之间(包括-999999999和999999999) |
seconds | 介于0和86399之间(包括0和86399) |
microseconds | 介于0和999999之间(包括0和999999) |
实例方法:
timedelta.total_seconds():返回时间差中包含的总的秒数。等同于td / timedelta(seconds=1)。
举例
print('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.000001milliseconds: 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
使用total_seconds()可以将一个时间增量的完整持续时间恢复为几秒。
for 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
Date Arithmetic
举例
使用date对象的这个例子演示了使用timedelta对象来计算新的日期,并减去日期实例来产生时间增量(包括一个负的delta值)。
today = 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 : 2017-07-02One day : 1 day, 0:00:00
Yesterday : 2017-07-01
Tomorrow : 2017-07-03
tomorrow - yesterday: 2 days, 0:00:00
yesterday - tomorrow: -2 days, 0:00:00
一个timedelta对象还支持整数、浮点数和其他时间增量实例的算术。
one_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)
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:005 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
Comparing Values
可以使用标准比较运算符来比较日期和时间值,以确定哪个时间更早或更晚。
举例
print('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('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:00
t2: 13:05:00
t1 < t2: True
Dates:
d1: 2017-07-02
d2: 2017-07-03
d1 > d2: False
Combining Dates and Times
使用datetime类来保存包含日期和时间组件的值。与date一样,有几种方便的类方法可以从其他公共值创建datetime实例。
classmethod datetime.now(tz=None):返回本地当前的日期和时间。如果可选参数tz为None或未指定,则这类似于today(),但如果可能,通过time.time()时间戳提供更高的精度(例如,这在提供C gettimeofday()函数的平台上是可能的)。如果tz不为None,则必须是tzinfo子类的实例,当前日期和时间将转换为tz的时区。在这种情况下,结果等效于tz.fromutc(datetime.utcnow().replace(tzinfo=tz))。
classmethod datetime.utcnow():返回当前UTC日期和时间,其中tzinfo为None。这类似now(),但返回当前UTC日期和时间,作为一个naive的datetime对象。可以通过调用datetime.now(timezone.utc)来得到aware的当前UTC datetime。
classmethod datetime.combine(date, time):返回一个新的datetime对象,其日期部分等于给定的date对象,其时间部分和tzinfo属性等于给定time对象。对于任何datetime对象d,d == datetime.combine(d.date(), d.timetz())。如果date是一个datetime对象,则会忽略其时间部分和tzinfo属性。
classmethod datetime.today():返回当前本地日期时间,其中tzinfo为None。这相当于datetime.fromtimestamp(time.time())。
classmethod date.today():返回当前本地的日期。这相当于date.fromtimestamp(time.time())。
举例
print('Now :', datetime.datetime.now())print('Today :', datetime.datetime.today())
print('UTC Now:', datetime.datetime.utcnow())
print()
FIELDS = ['year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond',]
d = datetime.datetime.now()
for attr in FIELDS:
print(' {:15}: {}'.format(attr, getattr(d, attr)))
输出:
Now : 2017-07-02 22:40:09.835000Today : 2017-07-02 22:40:09.835000
UTC Now: 2017-07-02 14:40:09.835000
year : 2017
month : 7
day : 2
hour : 22
minute : 40
second : 9
microsecond : 835000
与date一样,datetime为创建新实例提供了方便的类方法。它还包括fromordinal()和fromtimestamp()。
t = datetime.time(1, 2, 3)print('t :', t)
d = datetime.date.today()
print('d :', d)
dt = datetime.datetime.combine(d, t)
print('dt:', dt)
输出:
t : 01:02:03d : 2017-07-02
dt: 2017-07-02 01:02:03
Formatting and Parsing
datetime对象的默认字符串表示使用了iso-8601格式(yyymm-MM-ddthh:MM:ss.mmmmmm)。可以使用strftime()生成替代格式。
classmethod datetime.strptime(date_string, format):返回对应于date_string的datetime,根据format进行解析。这相当于datetime(*(time.strptime(date_string, format)[0:6]))如果time.strptime()无法解析date_string和format,或者如果返回的值不是时间元组,则会引发ValueError。
datetime.strftime(format):返回一个表示日期和时间的字符串,由显式的格式字符串控制。
举例
format = "%a %b %d %H:%M:%S %Y"today = datetime.datetime.today()
print('ISO :', today)
print('format(): {:%a %b %d %H:%M:%S %Y}'.format(today))
s = today.strftime(format)
print('strftime:', s)
d = datetime.datetime.strptime(s, format)
print('strptime:', d.strftime(format))
输出:
ISO : 2017-07-02 23:14:27.446000format(): Sun Jul 02 23:14:27 2017
strftime: Sun Jul 02 23:14:27 2017
strptime: Sun Jul 02 23:14:27 2017
strptime/strftime format codes
Symbol | Meaning | Example |
---|---|---|
%a | Abbreviated weekday name | 'Wed' |
%A | Full weekday name | 'Wednesday' |
%w | Weekday number – 0 (Sunday) through 6 (Saturday) | '3' |
%d | Day of the month (zero padded) | '13' |
%b | Abbreviated month name | 'Jan' |
%B | Full month name | 'January' |
%m | Month of the year | '01' |
%y | Year without century | '16' |
%Y | Year with century | '2016' |
%H | Hour from 24-hour clock | '17' |
%I | Hour from 12-hour clock | '05' |
%p | AM/PM | 'PM' |
%M | Minutes | '00' |
%S | Seconds | '00' |
%f | Microseconds | '000000' |
%z | UTC offset for time zone-aware objects | '-0500' |
%Z | Time Zone name | 'EST' |
%j | Day of the year | '013' |
%W | Week of the year | '02' |
%c | Date and time representation for the current locale | 'Wed Jan 13 17:00:00 2016' |
%x | Date representation for the current locale | '01/13/16' |
%X | Time representation for the current locale | '17:00:00' |
%% | A literal % character | '%' |
Time Zones
在datetime中,时区由tzinfo的子类表示。由于tzinfo是一个抽象的基类,所以应用程序需要定义一个子类,并为一些方法提供适当的实现以使其有用。
举例
min6 = datetime.timezone(datetime.timedelta(hours=6))plus6 = datetime.timezone(datetime.timedelta(hours=6))
d = datetime.datetime.now(min6)
print(min6, ':', d)
print(datetime.timezone.utc, ':', d.astimezone(datetime.timezone.utc))
print(plus6, ':', d.astimezone(plus6))
d_system = d.astimezone()
print(d_system.tzinfo, ' :', d_system)
Uninx输出:
UTC+06:00 : 2017-07-02 21:32:11.492124+06:00UTC+00:00 : 2017-07-02 15:32:11.492124+00:00
UTC+06:00 : 2017-07-02 21:32:11.492124+06:00
CST : 2017-07-02 23:32:11.492124+08:00
URL:https://pymotw.com/3/datetime/index.html
扩展学习库:pytz
以上是 Python datetime.md 的全部内容, 来源链接: utcz.com/z/387024.html