datetime

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

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: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的更多相关文章

  1. Django model '__week_day'与python datetime的weekday()

    上周出了个bug,按星期几查询数据的时候,发现查到的数据与显示的星期几并不相符,后来发现代码中按星期几查询,有的地方用的是Django QuerySet提供的'__week_day',有的地方用的是p ...

  2. python datetime 时间日期处理小结

    python datetime 时间日期处理小结 转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/47f340f1a85b5cb3a50f5232. ...

  3. python datetime笔记

    python datetime笔记 http://mint-green.diandian.com/post/2011-09-09/4892024 获取当前时间,并通过字符串输出. 格式为:%Y-%m- ...

  4. python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客

    python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客     python datetime模块strptime/strptime form ...

  5. python datetime和unix时间戳之间相互转换

                                python datetime和unix时间戳之间相互转换 1.代码:    import time    import datetime # ...

  6. Python datetime 格式化字符串:strftime()

    Python datetime 格式化字符串:strftime()   Python 的datetime模块 其实就是date和time 模块的结合, 常见的属性方法都比较常用 比如: datetim ...

  7. python datetime offset-aware与offset-navie相互转换

    python datetime offset-aware与offset-navie相互转换 2016年11月13日 16:20:43 阅读数:2393 有时,我们使用python 的datetime模 ...

  8. Python datetime 转 JSON

    Python datetime 转 JSON Python 中将 datetime 转换为 JSON 类型,在使用 Django 时遇到的问题. 环境: Python2.7 代码: import js ...

  9. python datetime处理时间

    原文:http://blog.csdn.net/JGood/article/details/5457284 Python提供了多个内置模块用于操作日期时间,像calendar,time,datetim ...

随机推荐

  1. ASP.NET MVC加载ASCX之后,并为之赋值

    Insus.NET有写过一篇<ASP.NET MVC显示UserControl控件(扩展篇)>http://www.cnblogs.com/insus/p/3642634.html ,还没 ...

  2. 使用VS2013 + EF6 连接Mysql数据库

    使用VS2013 + EF6 + .NET4.5 连接Mysql数据库 1.安装插件 在使用Visual Studio 2013添加ADO.NET实体数据模型新建连接时,默认是没有Mysql选项的.此 ...

  3. java的锁机制——synchronized

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  4. 批处理REG学习

    首先在批处理操作注册表之前,应该了解REG命令的使用方式,详情请参阅一下网址: https://www.jb51.net/article/30078.htm 从以上链接内容我们可以详细了解使用reg的 ...

  5. 使用javacv,解码socket接收的H264码流(byte[]),转为yuv处理,最后再合成转为H264

    其实是一个用java实现录像的功能,还没有实现,但解码和转码已经可以. 1.maven环境,pom.xml配置 1 <properties> 2 <javacpp.version&g ...

  6. Java基础——6种常用类讲解

    本文主要介绍几种Java中常用类的应用. 一.System类 从API当中我们可以看出,public final class System exends Object.System类包含一些有用的字段 ...

  7. uni-app初体验及打包成apk

    首先用HBuilderX新建建一个uni-app项目 新建一个目录ucenter,该目录下新建两个vue文件ucenter.vue和setting.vue ucenter.vue <templa ...

  8. HDU1824(2-SAT)

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. apicloud 消息推送与接收

    待解决的问题,如下: 在使用apicloud 的时候我们,在开发用户登录的时候可能会遇到这样的问题,当有2个设备a,b同事使用的app的时候并且是同一个人登录,我们需要去做判断,即大家常说的单点登录. ...

  10. 从零开始学习html(十四)单位和值

    一.颜色值 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <tit ...