时间是一个永恒的话题,在刚才的打字片刻,它就在指尖的缝隙中,像溪水般沿着山涧,飘落,蒸发。

我们可以手动将计算机的系统时钟设置为特定的日期、时间和时区,也可以手动设置任务计划提醒我们去做某事,但人的记忆是那么的不可靠,当时间的安排挤得你透不过气来,忘记也是当然的事。

Time

Python的内置的 time 模块让 Python程序能读取系统时钟的当前时间。

time.time()函数

Unix 纪元是编程中经常参考的时间:1970年1月1日0点,即协调世界时(UTC)。time.time()函数返回自那一刻以来的秒数,是一个浮点值,而这个数字称为 UNIX 纪元时间戳。

1
2
3
import time 
time.time()
# 1425063955.068649
1
2
3
4
5
6
7
8
9
10
11
t_timestamp = 817961652
# current_timestamp = int(time.time())
t_struct_time = time.localtime(t_timestamp) #== time.gmtime(t_timestamp)
## struct_time

# time.struct_time(tm_year=1995, tm_mon=12, tm_mday=3, tm_hour=3, tm_min=34,
# tm_sec=12, tm_wday=6, tm_yday=337, tm_isdst=0)
print(t_struct_time.tm_year,t_struct_time.tm_mon)
# 1995 12
time.asctime(t_struct_time)
# 'Sun Dec 3 11:34:12 1995'

strftime

strftime 指令 含义
%Y 带世纪的年份,例如’2014’
%y 不带世纪的年份,‘00’至’99’(1970 至 2069)
%m 数字表示的月份, ‘01’至’12’
%B 完整的月份,例如’November’
%b 简写的月份,例如’Nov’
%d 一月中的第几天,‘01’至’31’
%j 一年中的第几天,‘001’至’366’
%w 一周中的第几天,‘0’(周日)至’6’(周六)
%A 完整的周几,例如’Monday’
%a 简写的周几,例如’Mon’
%H 小时(24 小时时钟),‘00’至’23’
%I 小时(12 小时时钟),‘01’至’12’
%M 分,‘00’至’59’
%S 秒,‘00’至’59’
%p ‘AM’或’PM’
%% 就是’%'字符
1
2
3
4
5
6
7
8
9
10
11
12
13
time.strftime("%Y-%m-%d",t_struct_time)
# '1995-12-03'
time.strftime("%Y-%m-%d %H:%M:%S",t_struct_time)
# 1995-12-03 11:34:12
time.strftime("%y-%m-%d %H:%M:%S",t_struct_time)
# '95-12-03 11:34:12'
time.strftime("%D %H:%M:%S",t_struct_time) #== %D %m/%d/%y
# '12/03/95 11:34:12'
time.strftime("%Y %b %d %H:%M:%S %a +0000", t_struct_time)
# '1995 Dec 03 11:34:12 Sun +0000'

time.ctime(t_timestamp)
# 'Sun Dec 3 11:34:12 1995'
1
2
3
4
5
6
7
8
t_time = '12/03/95 11:34:12'
t_struct_time = time.strptime(t_time,"%m/%d/%y %H:%M:%S")
# time.struct_time(tm_year=1995, tm_mon=12, tm_mday=3, tm_hour=11, tm_min=34,
# tm_sec=12, tm_wday=6, tm_yday=337, tm_isdst=-1)
time.mktime(t_struct_time)
# 817961652.0
time.strftime("%Y-%m-%d %H:%M:%S",t_struct_time)
# '1995-12-03 11:34:12'

Datetime

datetime 比 time 高级了不少,可以理解为js里的Moment.js。在datetime 模块中包含了几个类,具体关系如下:

函数
timedelta 主要用于计算时间跨度
tzinfo 时区相关
time 只关注时间
date 只关注日期
datetime 同时有时间和日期

使用datetime.datetime.now()可以的datetime.datetime 实例。 对于一个 datetime.datetime 实例,主要会有以下属性及常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from datetime import *
## 获得当前时刻
datetime.now() ## datetime.now([tz]) 一般等于datetime.today()
# datetime.datetime(2020, 2, 28 , 13, 17, 7, 916000)
datetime.utcnow() # UTC 时间
# datetime.datetime(2020, 2, 28 , 5, 17, 55, 419000)
d = datetime.now()
print('%s/%s/%s %d:%d:%d.%d'%(d.year,d.month,d.day,d.hour,d.minute,d.second,d.microsecond))
# 2020/2/28 13:22:44.657000
d.tzinfo
# 2020/2/28 13:24:31.49500
d.date()
# datetime.date(2020, 2, 28)
d.time()
# datetime.time(13, 26, 41, 161000)

其他的话,

方法
datetime.timetuple() 返time.struct_time 对象
datetime.strftime(format) 按照format进行格式化输出
datetime.fromtimestamp(timestamp[, tz]) 由Unix Timestamp 构建对象
datetime.strptime(date_string, format) 给定时间格式解析字符串
1
2
datetime.datetime.fromtimestamp(1000000) 
# datetime.datetime(1970, 1, 12, 5, 46, 40)

Strftime

strftime的用法与time模块基本相同。

1
2
3
4
5
6
datetime.strptime('March 17, 2020', '%B %d, %Y') 
# datetime.datetime(2020, 3, 17, 0, 0)
datetime.strptime('2019/10/21 16:29:00', '%Y/%m/%d %H:%M:%S')
# datetime.datetime(2019, 10, 21, 16, 29)
datetime.strptime("October of '19", "%B of '%y")
# datetime.datetime(2019, 10, 1, 0, 0)

Delta

由于代码运行中时间的不确定性,我们创建一个固定的时间对象吧,

1
2
3
4
5
6
7
8
delta = timedelta(days=25, hours=5, minutes=20, seconds=0) 
delta.days, delta.seconds, delta.microseconds
# (25, 19200, 0)
(11, 36548, 0)
delta.total_seconds()
# 2179200.0
str(delta)
# '25 days, 5:20:00'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dt = datetime(2020, 1, 1, 12, 0, 0) ## 得到特定时刻的 datetime 对象
delta1 = timedelta(hours=25)
print(dt + delta1)
# 2020-01-02 13:00:00
print(dt - delta1)
# 2019-12-31 11:00:00

newyears2020 = datetime(2020, 1, 1, 0, 0, 0)
Jan31_2020 = datetime(2020, 1, 31, 0, 0, 0)
newyears2020 > Jan31_2020
# False
newyears2020 == Jan31_2020 - timedelta(hours=30*24)
# True
newyears2020 == Jan31_2020 - timedelta(days=30)
# True

Calendar

1
2
3
4
5
6
import calendar

yy = int(input("输入年份: "))
mm = int(input("输入月份: "))

print(calendar.month(yy,mm))
1
2
3
4
5
6
7
8
9
输入年份: 2020
输入月份: 2
February 2020
Mo Tu We Th Fr Sa Su
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
1
2
3
4
5
monthRange = calendar.monthrange(2020,8)
monthRange
# (5, 31)
calendar.mdays
# [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

REFERENCES