Python datetime.md

python

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 datetime

t = 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:30

hour : 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:00

Latest : 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.000001

0.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-02

ctime : 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 datetime

import 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               : 733114

fromordinal(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-31

d1: 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.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

使用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-02

One 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: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

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.835000

Today : 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:03

d : 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.446000

format(): 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

SymbolMeaningExample
%aAbbreviated weekday name'Wed'
%AFull weekday name'Wednesday'
%wWeekday number – 0 (Sunday) through 6 (Saturday)'3'
%dDay of the month (zero padded)'13'
%bAbbreviated month name'Jan'
%BFull month name'January'
%mMonth of the year'01'
%yYear without century'16'
%YYear with century'2016'
%HHour from 24-hour clock'17'
%IHour from 12-hour clock'05'
%pAM/PM'PM'
%MMinutes'00'
%SSeconds'00'
%fMicroseconds'000000'
%zUTC offset for time zone-aware objects'-0500'
%ZTime Zone name'EST'
%jDay of the year'013'
%WWeek of the year'02'
%cDate and time representation for the current locale'Wed Jan 13 17:00:00 2016'
%xDate representation for the current locale'01/13/16'
%XTime 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:00

UTC+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

回到顶部