python有三大时间模块,分别是time
,datetime
,calendar
,今天来学习下
首先要导入time
模块
import time
获取struct_time的时间字符串
time.asctime([t])
中t
为可选参数,可以是gmtime() or localtime()
返回的元组或struct_time
,当参数t
为空时,使用localtime()
返回的当前时间
time.asctime( )
'Sat Apr 11 20:08:57 2020'
time.asctime( time.gmtime(3600) )
'Thu Jan 1 01:00:00 1970'
time.asctime( time.localtime() )
'Sat Apr 11 20:49:56 2020'
获取UTC格式的struct_time
time.gmtime([secs])
将自计算机元年1970-01-01 00:00:00
以来以秒为单位的时间转换为 UTC
格式的struct_time
,其中 dst
标志始终为零。如果未提供secs
或为None
,则使用按time()
返回的当前时间(不考虑时区)
time.gmtime( )
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=11, tm_hour=13, tm_min=5, tm_sec=21, tm_wday=5, tm_yday=102, tm_isdst=0)
time.gmtime(3600)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
获取时间戳的时间字符串
time.ctime([secs])
将自计算机元年1970-01-01 00:00:00
以来以秒为单位的时间转换为时间字符串,如果未提供secs
或为None
,则使用按time()
返回的当前时间(不考虑时区),ctime(secs)
等价于 asctime(localtime(secs))
time.ctime( )
'Sat Apr 11 21:05:22 2020'
time.ctime( 3600 )
'Thu Jan 1 09:00:00 1970'
time.asctime( time.localtime(3600))
'Thu Jan 1 09:00:00 1970'
获取本地时间的struct_time
time.localtime([secs])
类似于gmtime()
,但转换为本地时间的struct_time
。如果未提供secs
或为None
,则使用按time()
返回的当前时间(考虑时区)
time.localtime( )
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=11, tm_hour=21, tm_min=9, tm_sec=44, tm_wday=5, tm_yday=102, tm_isdst=0)
time.localtime( 0 )# 考虑时区
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
程序休眠
time.sleep(secs)
暂停对给定秒数的调用线程的执行。参数可以是浮点数,以指示更精确的睡眠时间。常用于程序的休眠设置。
time.sleep(5)
格式化时间字符串
time.strftime(format[, t])
将表示gmtime() or localtime()
返回的时间的元组或struct_time转换为格式参数指定的字符串。如果未提供t
,则使用本地时间返回的当前时间。格式必须是字符串。如果t中的任何字段超出允许的范围,则引发值错误。
0
在时间元组的任意位置都是合法的。
from time import gmtime, strftime
strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Sat, 11 Apr 2020 13:28:27 +0000'
from time import localtime, strftime
strftime("%a, %d %b %Y %H:%M:%S +0800", localtime())
'Sat, 11 Apr 2020 21:29:42 +0800'
strftime("%p ", localtime())
'PM '
指令 | 意义 |
---|---|
%a | 缩写工作日名称。 |
%A | 完整工作日名称。 |
%b | 缩写月份名称。 |
%B | 完整月份名称。 |
%c | 适当的日期和时间表示形式。 |
%d | 当月中的某一天用十进制数字表示 [01,31]。 |
%H | 小时(24小时时钟)用十进制数字表示 [00,23]。 |
%I | 小时(12 小时时钟)用十进制数字表示 [01,12]。 |
%j | 一年中的某一天用十进制数字表示 [001,366]。 |
%m | 月份用十进制数字表示 [01,12]。 |
%M | 分钟用十进制数字表示 [00,59]。 |
%p | 根据输入的时间返回AM 或 PM。 |
%S | 秒用十进制数字表示 [00,61]。 |
%U | 一年的周数(星期日作为星期的第一天)用十进制数字表示 [00,53]。新一年中第一个星期日之前的所有日子都被视为在第 0 周。 |
%w | 工作日用十进制数字表示 [0(星期日),6])。 |
%W | 一年的周数(星期一作为星期的第一天)用十进制数字表示 [00,53]。新一年中第一个星期一之前的所有日子都被视为在第 0 周。 |
%x | 适当的日期表示。 |
%X | 适当的时间表示。 |
%y | 无世纪年份用十进制数字表示[00,99]。 |
%Y | 有世纪年份用十进制数字表示。 |
%z | 时区偏移量表示与窗体 [HHMM 或 -HHMM 的 UTC/GMT 的正或负时差,其中 H 表示十进制小时数字,M 表示十进制分钟数字 [-23:59, [23:59]。 |
%Z | 时区名称(如果没有时区,则无字符)。 |
%% | 文本字符。'%' |
解析时间字符串
根据格式分析表示时间的字符串。返回值是gmtime() or localtime()
返回的struct_time
。
格式参数使用与strftime()
使用指令相同的指令。它默认使用"%a %b %d %H:%M:%S %Y"
格式,与ctime()
返回的格式匹配的格式。如果无法根据格式分析字符串,或者分析后具有多余的数据,则引发ValueError
。当无法推断更准确的值时,用于填充任何缺失数据的默认值为(1900, 1, 1, 0, 0, 0, 0, 1, -1)
。字符串和格式都必须是字符串
import time
time.strptime("30 Nov 68", "%d %b %y")
import time
time.strptime("30 Nov 69", "%d %b %y"
import timetime.strptime("30 Nov 69", "%d %b %y")
time.struct_time(tm_year=1969, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=334, tm_isdst=-1)
时间元组
time.struct_time
由 gmtime(), localtime(), and strptime()
返回的时间值序列的类型。它是具有命名元组接口的对象:可以通过索引和属性名称访问值。存在以下值:
import time
print(time.strptime(ctime()))
print(time.strptime(ctime())[0])
print(time.strptime(ctime())[1])
print(time.strptime(ctime())[2])
print(time.strptime(ctime())[3])
print(time.strptime(ctime()).tm_min)
print(time.strptime(ctime()).tm_sec)
print(time.strptime(ctime()).tm_wday)# 0..6
print(time.strptime(ctime()).tm_yday)
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=11, tm_hour=22, tm_min=43, tm_sec=6, tm_wday=5, tm_yday=102, tm_isdst=-1)
2020
4
11
22
43
6
5
102
Index | Attribute | Values |
---|---|---|
0 | tm_year | (for example, 1993) |
1 | tm_mon | range [1, 12] |
2 | tm_mday | range [1, 31] |
3 | tm_hour | range [0, 23] |
4 | tm_min | range [0, 59] |
5 | tm_sec | range [0, 61] |
6 | tm_wday | range [0, 6], Monday is 0 |
7 | tm_yday | range [1, 366] |
8 | tm_isdst | 0, 1 or -1 |
N/A | tm_zone | abbreviation of timezone name |
N/A | tm_gmtoff | offset east of UTC in seconds |
获取时间戳UTC秒
time.time()
计算机元年1970-01-01 00:00:00
以来的时间以秒为单位作为浮点数返回.
time.time()
1586615526.449903
time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
常用的四个类:date
, time
, datetime
, timedelta
date
date
表示日历中的日期。date
的常用方法如下
from datetime import date
date.today() # 返回当前日期
datetime.date(2020, 4, 12)
date.fromtimestamp(1588291200) # 返回UTC的日期
datetime.date(2020, 5, 1)
date.fromisoformat('2020-04-12') # 返回ISO时间字符串的日期
datetime.date(2020, 4, 12)
date
类的属性
date.today().year
2020
date.today().month
4
date.today().day
12
date
类的实例方法
d = date(2002, 12, 31)
d.replace(day=26) # 年月日替换
datetime.date(2002, 12, 26)
date.timetuple(date(2020,12,31)) # 返回日期的元组
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=366, tm_isdst=-1)
date.weekday(date(2020,4,12)) # 返回星期几,0..6
6
date.isoweekday(date(2020,4,12)) # 返回星期几,1..7
7
date.isocalendar(date(2020,1,1)) # 返回三元组 (ISO年份,ISO周号,ISO工作日)
(2020, 1, 3)
date.isoformat(date(2020,4,12)) # 返回ISO标准日期字符串
'2020-04-12'
date.__str__(date(2020,4,12)) # 等效于date.isoformat(date(2020,4,12))
'2020-04-12'
date(2020,4,12).ctime() # 返回时间字符串
'Sun Apr 12 00:00:00 2020'
date(2020,4,12).strftime("%d/%m/%Y") # 格式化日期
'12/04/2020'
# date.__format__(format)
date(2020,4,12).__format__("%d/%m/%Y") # 等效于date.strftime("format"),使得可以在格式化的字符串文本中使用
'12/04/2020'
'The {1} is {0:%d}, the {2} is {0:%B}.'.format(date(2020,4,12), "day", "month")
'The day is 12, the month is April.'
datetime
常用函数方法
from datetime import datetime
datetime.today()
datetime.datetime(2020, 4, 12, 8, 10, 1, 750533)
datetime.now()# 本地时间,有时区
datetime.datetime(2020, 4, 12, 8, 12, 22, 442582)
datetime.utcnow() #UTC时间,无时区
datetime.datetime(2020, 4, 12, 0, 43, 50, 822484)
#datetime.fromtimestamp(timestamp, tz=None)
datetime.fromtimestamp(1588291200, tz=None)# 本地时间
datetime.datetime(2020, 5, 1, 8, 0)
#datetime.utcfromtimestamp(timestamp)
datetime.utcfromtimestamp(1588291200)# UTC时间
datetime.datetime(2020, 5, 1, 0, 0)
#datetime.combine(date, time, tzinfo=self.tzinfo)
from datetime import date,time
d = date(2020, 4, 12)
t = time(12,30)
z = None
datetime.combine(d, t, tzinfo=z)
datetime.datetime(2020, 4, 12, 12, 30)
#datetime.fromisoformat(date_string), YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
datetime.fromisoformat('2020-04-12 11:11:11')
datetime.datetime(2020, 4, 12, 11, 11, 11)
#datetime.strptime(date_string, format)
datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
datetime.datetime(2006, 11, 21, 16, 30)
datetime属性
print(datetime.now())
print(datetime.now().year)
print(datetime.now().month)
print(datetime.now().day)
print(datetime.now().hour)
print(datetime.now().minute)
print(datetime.now().second)
print(datetime.now().microsecond)
print(datetime.now().tzinfo)
2020-04-12 09:14:03.809207
2020
4
12
9
14
3
810208
None
datetime实例方法
from datetime import date
datetime(2020,4,12).date()
datetime.date(2020, 4, 12)
datetime(2020,4,12).time()
datetime.time(0, 0)
datetime(2020,4,12).weekday()
6
datetime(2020,4,12).isoweekday()
7
datetime(2020,4,12).timetuple()
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=103, tm_isdst=-1)
datetime(2020,4,12).timestamp()
1586620800.0
datetime(2020,4,12).isocalendar()
(2020, 15, 7)
time
time
属性
from datetime import time
print(time(12,1,1).hour)
print(time(12,1,1).minute)
print(time(12,1,1).second)
print(time(12,1,1).microsecond)
12
1
1
0
from datetime import time
time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
'12:34'
dt = time(hour=12, minute=34, second=56, microsecond=0)
dt.isoformat()
'12:34:56'
dt.isoformat(timespec='auto')
'12:34:56'
dt.isoformat(timespec='hours')
'12'
dt.isoformat(timespec='minutes')
'12:34'
dt.isoformat(timespec='seconds')
'12:34:56'
dt.isoformat(timespec='milliseconds')
'12:34:56.000'
dt.isoformat(timespec='microseconds')
'12:34:56.000000'
dt.__str__()# 等效于t.isoformat()
'12:34:56'
#time.strftime(format)
dt.strftime("%H:%M:%S")
'12:34:56'
timedelta
datetime
返回两个日期或时间的时间间隔。内部仅使用days, seconds and microseconds
days
:[-999999999..999999999]
seconds
:[0..86399]
microseconds
:[0..999999]
from datetime import timedelta
year = timedelta(days=365)
another_year = timedelta(weeks=40, days=84, hours=23,
minutes=50, seconds=600) # adds up to 365 days
year.total_seconds()
31536000.0
year == another_year
True
ten_years = 10 * year
ten_years, ten_years.days // 365
(datetime.timedelta(days=3650), 10)
nine_years = ten_years - year
nine_years, nine_years.days // 365
(datetime.timedelta(days=3285), 9)
three_years = nine_years // 3
three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
abs(three_years - ten_years) == 2 * three_years + year
True
def month_day():
import
import calendar
from datetime import date
mydate=date.today()
month_calendar_str = calendar.month(mydate.year, mydate.month)
print(f"{month_calendar_str}\n")# 当月的日历图
April 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 30
def month_days(year,month):
from datetime import date,timedelta
begin_date=date(year,month,1)
end_date=date(year,month+1,1)
days = (end_date-begin_date).days
month_days=[]
for i in range(1,days+1):
month_days.append(date(year,month,i))
for str in month_days:
print(str)
month_days(2020,4)
2020-04-01
2020-04-02
2020-04-03
2020-04-04
2020-04-05
2020-04-06
2020-04-07
2020-04-08
2020-04-09
2020-04-10
2020-04-11
2020-04-12
2020-04-13
2020-04-14
2020-04-15
2020-04-16
2020-04-17
2020-04-18
2020-04-19
2020-04-20
2020-04-21
2020-04-22
2020-04-23
2020-04-24
2020-04-25
2020-04-26
2020-04-27
2020-04-28
2020-04-29
2020-04-30
def week_days(year,week):
from datetime import date,datetime,timedelta
diff_weekday = 8-datetime(year,1,1).isocalendar()[2]
diff_week = week-datetime(year,1,1).isocalendar()[1]
first_day = date(year,1,1)+timedelta(diff_weekday+7*diff_week-7)
week_days=[]
for i in range(7):
week_days.append(first_day+timedelta(i))
for str in week_days:
print(str)
week_days(2020,16)
2020-04-13
2020-04-14
2020-04-15
2020-04-16
2020-04-17
2020-04-18
2020-04-19
datetime(2020,4,13).isocalendar()
(2020, 16, 1)