资讯专栏INFORMATION COLUMN

PyTips 0x11 - Python 时间与日期

2501207950 / 1071人阅读

摘要:项目地址时间和日期可能涉及到不同的时区格式,同时又经常需要作为时间戳保存,有时候还需要进行一些加减操作,因此处理起来通常会因为方法太多而无从下手。中与时间和日期相关的标准库有个和。

项目地址:https://git.io/pytips

时间和日期可能涉及到不同的时区、格式,同时又经常需要作为时间戳保存,有时候还需要进行一些加减操作,因此处理起来通常会因为方法太多而无从下手。Python 中与时间和日期相关的标准库有3个:timedatetimecalendar。其中 time 模块更偏向于系统相关的时间数据,最常用的可能就是获取当前时间的秒数 time.time(),此外该模块中的很多方法都是与 C 语言中的时间方法相同的,如果习惯了使用 C 的人可以很方便地继续使用这些方法。calendar 则是在时间与日期之上,它的作用真的就是“日历”:

from calendar import TextCalendar, HTMLCalendar

tc = TextCalendar(firstweekday=6)
tc.prmonth(2016, 3)
     March 2016
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
 

datetime 模块解决了绝大部分时间与日期相关的操作问题,其中包含了:

timedelta 与时间计算相关的类;

time 时间相关的类;

date 日期相关的类;

datetime 时间和日期;

tzinfo/timezone 与时区相关的类(timezone 是 Python 3.2 之后新加入的);

它们的继承关系如下:

"""
object
    timedelta
    tzinfo
        timezone
    time
    date
        datetime
"""
pass
import time as _time
from datetime import date, time, datetime
Date

date 由年、月、日组成,有下面几种方式创建一个 date 对象(strptime 是通用方法,将在后面介绍):

d1 = date(2016, 3, 29)
d2 = date.today()
d3 = date.fromtimestamp(_time.time())

print(d1)
print(d2)
print(d3)
2016-03-29
2016-03-30
2016-03-30

获得 date 对象之后,可以分别获取年、月、日等属性(strftime也是通用的格式化方法,将在后面介绍):

print("{}/{}/{}".format(d2.day, d2.month, d2.year))

# date.timetuple() 返回 time 模块中的 struct_time 结构,可以直接转换成 Tuple
print("time.struct_time: {}".format(tuple(d2.timetuple()))) 

# 星期数
print("Monday is 0: {}
Monday is 1: {}".format(d2.weekday(), d2.isoweekday()))
30/3/2016
time.struct_time: (2016, 3, 30, 0, 0, 0, 2, 90, -1)
Monday is 0: 2
Monday is 1: 3
Time

datetime.time 由小时、分钟、秒、微秒(百万分之一秒)组成,和 date 相似的创建方式,但是由于和 time 模块有所重叠,因此并不经常直接用于创建时间对象,如果需要可以从 datetime.datetime 分割出来:

t1 = time(22, 57, 6, 6)
t2 = datetime.now().time()
print(t1)
print(t2)
22:57:06.000006
23:56:12.495372
datetime.datetime

datetime.datetime 继承自 date,同时将精度精确到时间,创建方式有:

dt1 = datetime(2016, 3, 30, 22, 2)
dt2 = datetime.now()
dt3 = datetime.fromtimestamp(_time.time())
print(dt1)
print(dt2)
print(dt3)
2016-03-30 22:02:00
2016-03-30 23:56:13.800861
2016-03-30 23:56:13.800924

datetime.datetime 中我们可以获取 datetime,同样也可以通过 datetime 组合得来:

dt = datetime.now()
dt = datetime.fromtimestamp(_time.time())

d = dt.date()
t = dt.time()

print("Date: {}
Time: {}".format(d, t))

print("Datetime: {}".format(datetime.combine(date.today(), time(2,3,3))))
Date: 2016-03-30
Time: 23:56:15.078349
Datetime: 2016-03-30 02:03:03
时间与日期的运算

如果把 datetimedatetime 看作是时间轴上的点,那么 timedelta 就是时间轴上的线段(时间段,时间间隔)。

from datetime import timedelta

td = timedelta(weeks=1, days=2, hours=3,minutes=4, seconds=0, microseconds=0, milliseconds=0)

print("Time duration: {}".format(td))
Time duration: 9 days, 3:04:00

既然是时间段,那就可以通过两个时间点相减得到:

current = datetime.now()
today = datetime.combine(date.today(), time(0,0,0))

td = current - today
print("{:.0f}s of Today".format(td.total_seconds()))

today = date.today()
lastyear = today.replace(year=today.year-1)
print(today - lastyear)

t1 = current.time()
t2 = time(0, 0, 0)
try:
    print(t1 - t2)
except TypeError as err:
    print(err)
86178s of Today
366 days, 0:00:00
unsupported operand type(s) for -: "datetime.time" and "datetime.time"

时间段还支持一些算术+-*///%abs 等,这里就不一一举例了。

strftime & strptime

strftime(String from Time)和 strptime(String parsed Time)分别是字符串和时间日期之间的转换方法,只不过遵循一定的格式:

print(datetime.strftime.__doc__)
print(datetime.strptime.__doc__)
format -> strftime() style string.
string, format -> new datetime parsed from a string (like time.strptime()).
fmat = "%y-%m-%d"
dt = datetime.now()

s = dt.strftime(fmat)
print(s)
print(datetime.strptime(s, fmat))
16-03-30
2016-03-30 00:00:00

可以通过 strftime() and strptime() Behavior 查看转换格式表,Python 使用的格式与 C standard(1989)是一致的,不过需要注意的是,所有格式都是 zero-padded,也就是自动补零的,如果想要去掉补零,可以用 %-m 等方式,但据说在 Windows 系统上是不能用的:D

fmat = "%y/%-m/%-d"
dt = datetime.now()
dt = dt - timedelta(days=22)

print(dt.strftime(fmat))

# 当然也可以用
print("{}/{}/{}".format(dt.strftime("%y"), dt.month, dt.day))
16/3/8
16/3/8


欢迎关注公众号 PyHub 每日推送

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37858.html

相关文章

  • PyTips 0x07 - Python 字符串

    摘要:项目地址所有用过的人应该都看过下面两行错误信息这就是界的锟斤拷今天和接下来几期的内容将主要关注中的字符串字节及两者之间的相互转换。 项目地址:https://git.io/pytips 所有用过 Python (2&3)的人应该都看过下面两行错误信息: UnicodeEncodeError: ascii codec cant encode characters in position...

    go4it 评论0 收藏0
  • PyTips 0x10 - Python 的堆优先队列

    摘要:项目地址中内置的库和分别提供了堆和优先队列结构,其中优先队列本身也是基于实现的,因此我们这次重点看一下。堆可以用于实现调度器例见之协程,更常用的是优先队列例如。 项目地址:https://git.io/pytips Python 中内置的 heapq 库和 queue 分别提供了堆和优先队列结构,其中优先队列 queue.PriorityQueue 本身也是基于 heapq 实现的,因...

    dreambei 评论0 收藏0
  • PyTips 0x05 - Python 函数参数解包

    摘要:这里的关键词函数必须明确指明,不能通过位置推断则代表任意数量的关键词参数添加的新特性,使得可以在函数参数之外使用这里的逗号不能漏掉所谓的解包实际上可以看做是去掉的元组或者是去掉的字典。 项目地址:https://git.io/pytips 函数调用的参数规则与解包 Python 的函数在声明参数时大概有下面 4 种形式: 不带默认值的:def func(a): pass 带有默认值的...

    pubdreamcc 评论0 收藏0
  • PyTips 0x09 - Python 中 Unicode 的正确用法

    摘要:只包含了个基本拉丁字母阿拉伯数目字和英式标点符号一共个字符,因此只需要不占满一个字节就可以存储,而则涵盖的数据除了视觉上的字形编码方法标准的字符编码外,还包含了字符特性,如大小写字母,共可包含个字符,而到现在只填充了其中的个位置。 项目地址:https://git.io/pytips 0x07 和 0x08 分别介绍了 Python 中的字符串类型(str)和字节类型(byte),以及...

    shenhualong 评论0 收藏0
  • PyTips 0x03 - Python 列表推导

    摘要:项目地址列表推导中提到的方法可以通过简化的语法快速构建我们需要的列表或其它可迭代对象,与它们功能相似的,还提供列表推导的语法。 项目地址:https://git.io/pytips 0x03 - Python 列表推导 0x02 中提到的 map/filter 方法可以通过简化的语法快速构建我们需要的列表(或其它可迭代对象),与它们功能相似的,Python 还提供列表推导(List C...

    sugarmo 评论0 收藏0

发表评论

0条评论

2501207950

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<