超全!Python 处理日期与时间的全面总结!
目录
时间相关概念 Python time模块 时间格式化 计时器功能 time模块其他内置函数 time模块包含的属性 datetime模块 date类 time类 datetime类 timedelta类 tzinfo类 pytz模块 时区转换 夏令时处理 dateutil模块 parser.parse() rrule.rrule() Arrow UTC 时间 当地时间 解析时间 Unix 时间戳 格式化日期和时间 转换为区域时间 工作日 移动时间 夏令时 人性化的日期和时间 ISO 8601类
时间相关概念
👉点击领取:最全Python资料合集
Python time模块
time() 返回时间戳格式的时间 (相对于1.1 00:00:00以秒计算的偏移量) ctime() 返回字符串形式的时间,可以传入时间戳格式时间,用来做转化 asctime() 返回字符串形式的时间,可以传入struct_time形式时间,用来做转化 localtime() 返回当前时间的struct_time形式,可传入时间戳格式时间,用来做转化 gmtime() 返回当前时间的struct_time形式,UTC时区(0时区) ,可传入时间戳格式时间,用来做转化
>>> import time>>> time.time()1473386416.954>>> time.ctime()'Fri Sep 09 10:00:25 2016'>>> time.ctime(time.time())'Fri Sep 09 10:28:08 2016'>>> time.asctime()'Fri Sep 09 10:22:40 2016'>>> time.asctime(time.localtime())'Fri Sep 09 10:33:00 2016'>>> time.localtime()time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=10, tm_min=1, tm_sec=19, tm_wday=4, tm_yday=253, tm_isdst=0)>>> time.localtime(time.time())time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=10, tm_min=19, tm_sec=11, tm_wday=4, tm_yday=253, tm_isdst=0)>>> time.gmtime()time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=2, tm_min=13, tm_sec=10, tm_wday=4, tm_yday=253, tm_isdst=0)>>> time.gmtime(time.time())time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=2, tm_min=15, tm_sec=35, tm_wday=4, tm_yday=253, tm_isdst=0)
tm_wday 一周的第几天(周日是0) tm_yday 一年的第几天 tm_isdst 是否是夏令时
时间格式化
将一个以struct_time格式转换为时间戳
>>> time.mktime(time.localtime())1473388585.0
%c 本地相应的日期和时间表示 %x 本地相应日期 %X 本地相应时间 %y 去掉世纪的年份(00 – 99) %Y 完整的年份 %m 月份(01 – 12) %b 本地简化月份名称 %B 本地完整月份名称 %d 一个月中的第几天(01 – 31) %j 一年中的第几天(001 – 366) %U 一年中的星期数。(00 – 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。 %w 一个星期中的第几天(0 – 6,0是星期天) %a 本地(locale)简化星期名称 %A 本地完整星期名称 %H 一天中的第几个小时(24小时制,00 – 23) %I 第几个小时(12小时制,01 – 12) %p 本地am或者pm的相应符,“%p”只有与“%I”配合使用才有效果。 %M 分钟数(00 – 59) %S 秒(01 – 61),文档中强调确实是0 – 61,而不是59,闰年秒占两秒 %Z 时区的名字(如果不存在为空字符) %% ‘%’字符
>>> time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())'2016-09-09 10:54:21'
把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
>>> time.strptime(time.ctime())time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=11, tm_min=0, tm_sec=4, tm_wday=4, tm_yday=253, tm_isdst=-1)
计时器功能
这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确)
import timetime.sleep(1)print("clock1:%s" % time.clock())time.sleep(1)print("clock2:%s" % time.clock())time.sleep(1)print("clock3:%s" % time.clock())
运行结果为:
clock1:1.57895443216e-06clock2:1.00064381867clock3:2.00158724394
time模块其他内置函数
altzone() 返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。 tzset() 根据环境变量TZ重新初始化时间相关设置。
time模块包含的属性
timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。 tzname 包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称和不带的。
import timeprint(time.timezone)print(time.tzname)print(time.tzname[0].decode("GBK"))print(time.tzname[1].decode("GBK"))
运行结果
-28800('\xd6\xd0\xb9\xfa\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4', '\xd6\xd0\xb9\xfa\xcf\xc4\xc1\xee\xca\xb1')中国标准时间中国夏令时
datetime模块
date:表示日期的类。常用的属性有year, month, day time:表示时间的类。常用的属性有hour, minute, second, microsecond datetime:表示日期时间 timedelta:表示时间间隔,即两个时间点之间的长度 tzinfo:与时区有关的相关信息
date类
max、min:date对象所能表示的最大、最小日期 resolution:date对象表示日期的最小单位。这里是天 today():返回一个表示当前本地日期的date对象 fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象 fromordinal(ordinal):将Gregorian日历时间转换为date对象(特殊历法用不上)
from datetime import dateimport timeprint('date.max:', date.max)print('date.min:', date.min)print('date.resolution:', date.resolution)print('date.today():', date.today())print('date.fromtimestamp():', date.fromtimestamp(time.time()))
执行结果:
date.max: 9999-12-31date.min: 0001-01-01date.resolution: 1 day, 0:00:00date.today(): 2016-09-12date.fromtimestamp(): 2016-09-12
.year:返回年 .month:返回月 .day:返回日 .replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变) .weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推 .isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推 .isocalendar():返回格式如(year, wk num, wk day) .isoformat():返回格式如’YYYY-MM-DD’的字符串 .strftime(fmt):自定义格式化字符串。与time模块中的strftime类似。 .toordinal():返回日期对应的Gregorian Calendar日期
from datetime import datetoday = date.today()print('today:', today)print('.year:', today.year)print('.month:', today.month)print('.replace():', today.replace(year=2017) )print('.weekday():', today.weekday())print('.isoweekday():', today.isoweekday())print('.isocalendar():', today.isocalendar())print('.isoformat():', today.isoformat())print('.strftime():', today.strftime('%Y-%m-%d') )print('.toordinal():', today.toordinal())
执行结果:
today: 2016-09-12.year: 2016.month: 9.replace(): 2017-09-12.weekday(): 0.isoweekday(): 1.isocalendar(): (2016, 37, 1).isoformat(): 2016-09-12.strftime(): 2016-09-12.toordinal(): 736219
date2 = date1 + timedelta # 日期加上一个间隔,返回一个新的日期对象 date2 = date1 – timedelta # 日期减去一个间隔,返回一个新的日期对象 timedelta = date1 – date2 # 两个日期相减,返回一个时间间隔对象 date1 < date2 # 两个日期进行比较
time类
min、max:time类所能表示的最小、最大时间。其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999) resolution:时间的最小单位,这里是1微秒
.hour、.minute、.second、.microsecond:时、分、秒、微秒 .tzinfo:时区信息 .replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变); .isoformat():返回型如”HH:MM:SS”格式的字符串表示; .strftime(fmt):返回自定义格式化字符串。
datetime类
min、max:datetime所能表示的最小值与最大值; resolution:datetime最小单位; today():返回一个表示当前本地时间的datetime对象; now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间; utcnow():返回一个当前utc时间的datetime对象; fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息; utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象; combine(date, time):根据date和time,创建一个datetime对象; strptime(date_string, format):将格式字符串转换为datetime对象;
from datetime import datetimeimport timeprint('datetime.max:', datetime.max)print('datetime.min:', datetime.min)print('datetime.resolution:', datetime.resolution)print('today():', datetime.today())print('now():', datetime.now())print('utcnow():', datetime.utcnow())print('fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time()))print('utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()))
运行结果:
datetime.max: 9999-12-31 23:59:59.999999datetime.min: 0001-01-01 00:00:00datetime.resolution: 0:00:00.000001today(): 2016-09-12 19:57:00.761000now(): 2016-09-12 19:57:00.761000utcnow(): 2016-09-12 11:57:00.761000fromtimestamp(tmstmp): 2016-09-12 19:57:00.761000utcfromtimestamp(tmstmp): 2016-09-12 11:57:00.761000
date():获取date对象; time():获取time对象; replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]): timetuple() utctimetuple() toordinal() weekday() isocalendar() isoformat([sep]) ctime():返回一个日期时间的C格式字符串,等效于ctime(time.mktime(dt.timetuple())); strftime(format)
timedelta类
tzinfo类
pytz模块
下面就是实现格林威治时间和北京时间的tzinfo类的例子:
ZERO_TIME_DELTA = timedelta(0)LOCAL_TIME_DELTA = timedelta(hours=8) # 本地时区偏差class UTC(tzinfo):def utcoffset(self, dt):return ZERO_TIME_DELTAdef dst(self, dt):return ZERO_TIME_DELTAclass LocalTimezone(tzinfo):def utcoffset(self, dt):return LOCAL_TIME_DELTAdef dst(self, dt):return ZERO_TIME_DELTAdef tzname(self, dt):return '+08:00'
pytz提供了全部的timezone信息,如:
import pytzprint(len(pytz.all_timezones))print(len(pytz.common_timezones))
运行结果:
588436
如果需要获取某个国家的时区,可以使用如下方式:
import pytzprint(pytz.country_timezones('cn'))
执行结果:
[u'Asia/Shanghai', u'Asia/Urumqi']中国一个有两个时区,一个为上海,一个为乌鲁木齐,我们来看下我们有什么区别:
from datetime import datetimeimport pytzprint(pytz.country_timezones('cn'))tz1 = pytz.timezone(pytz.country_timezones('cn')[0])print(tz1)print(datetime.now(tz1))tz2 = pytz.timezone(pytz.country_timezones('cn')[1])print(tz2)print(datetime.now(tz2))
执行结果:
[u'Asia/Shanghai', u'Asia/Urumqi']Asia/Shanghai2016-09-14 09:55:39.384000+08:00Asia/Urumqi2016-09-14 07:55:39.385000+06:00
时区转换
操作起来有而比较简单,本地时区与UTC的互转:
from datetime import datetimeimport pytznow = datetime.now()tz = pytz.timezone('Asia/Shanghai')print(tz.localize(now))print(pytz.utc.normalize(tz.localize(now)))
执行结果:
2016-09-14 10:25:44.633000+08:002016-09-14 02:25:44.633000+00:00
使用astimezone()可以进行时区与时区之间的转换。
from datetime import datetimeimport pytzutc = pytz.utcbeijing_time = pytz.timezone('Asia/Shanghai')japan_time = pytz.timezone('Asia/Tokyo')now = datetime.now(beijing_time)print("Beijing Time:",now)print("UTC:",now.astimezone(utc))print("JAPAN TIME:",now.astimezone(japan_time))
执行结果:
Beijing Time: 2016-09-14 10:19:22.671000+08:00UTC: 2016-09-14 02:19:22.671000+00:00JAPAN TIME: 2016-09-14 11:19:22.671000+09:00
民國17年(1928年),國民政府統一中國,原中央觀象台的業務由南京政府中央研究院的天文研究所和氣象研究所分別接收。天文研究所編寫的曆書基本上沿襲中央觀象台的做法,仍將全國劃分為5個標準時區,只是在有關交氣、合朔、太陽出沒時刻等處,不再使用北平的地方平時,而改以南京所在的標準時區的區時即東經120°標準時替代。從北平地方平時改為東經120°標準時,兩者相差了352秒。
from datetime import datetimeimport pytznow = datetime.now()print(now)tz = pytz.timezone('Asia/Shanghai')print(now.replace(tzinfo=tz))
2016-09-14 10:29:20.2000002016-09-14 10:29:20.200000+08:06
夏令时处理
dateutil模块
parser.parse()
解析时间到datetime格式,支持大部分时间字符串。没指定时间默认是0点,没指定日期默认是今天,没指定年份默认是今年。
from dateutil import parserprint(parser.parse("8th March,2004"))print(parser.parse("8 March,2004"))print(parser.parse("March 8th,2004"))print(parser.parse("March 8,2004"))print(parser.parse("2016-09-14"))print(parser.parse("20160914"))print(parser.parse("2016/09/14"))print(parser.parse("09/14/2016"))print(parser.parse("09,14"))print(parser.parse("12:00:00"))print(parser.parse("Wed, Nov 12"))
执行结果:
2004-03-08 00:00:002004-03-08 00:00:002004-03-08 00:00:002004-03-08 00:00:002016-09-14 00:00:002016-09-14 00:00:002016-09-14 00:00:002016-09-14 00:00:002016-09-09 00:00:002016-09-14 12:00:002016-11-12 00:00:00
rrule.rrule()
freq:可以理解为单位。可以是 YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY。即年月日周时分秒。 dtstart,until:是开始和结束时间。 wkst:周开始时间。 interval:间隔。 count:指定生成多少个。 byxxx:指定匹配的周期。比如byweekday=(MO,TU)则只有周一周二的匹配。byweekday可以指定MO,TU,WE,TH,FR,SA,SU。即周一到周日。
Arrow
UTC 时间
使用to()方法,我们将 UTC 时间转换为本地时间。
import arrowutc = arrow.utcnow()print(utc)print(utc.to('local'))
当地时间
本地时间是特定区域或时区中的时间。
import arrownow = arrow.now()print(now)print(now.to('UTC'))
解析时间
get()方法用于解析时间。
import arrowd1 = arrow.get('2012-06-05 16:20:03', 'YYYY-MM-DD HH:mm:ss')print(d1)d2 = arrow.get(1504384602)print(d2)
Unix 时间戳
import arrowutc = arrow.utcnow()print(utc)unix_time = utc.timestampprint(unix_time)date = arrow.Arrow.fromtimestamp(unix_time)print(date)
也可以将日期格式化为 Unix 时间。
import arrowutc = arrow.utcnow()print(utc.format('X'))
格式化日期和时间
日期和时间可以用format()方法格式化。
import arrownow = arrow.now()year = now.format('YYYY')print("Year: {0}".format(year))date = now.format('YYYY-MM-DD')print("Date: {0}".format(date))date_time = now.format('YYYY-MM-DD HH:mm:ss')print("Date and time: {0}".format(date_time))date_time_zone = now.format('YYYY-MM-DD HH:mm:ss ZZ')print("Date and time and zone: {0}".format(date_time_zone))
转换为区域时间
import arrowutc = arrow.utcnow()print(utc.to('US/Pacific').format('HH:mm:ss'))print(utc.to('Europe/Bratislava').format('HH:mm:ss'))print(utc.to('Europe/Moscow').format('HH:mm:ss'))
工作日
可以使用weekday()或format()方法找到日期的工作日。
import arrowd1 = arrow.get('1948-12-13')print(d1.weekday())print(d1.format('dddd'))
移动时间
shift()方法用于移动时间。
import arrownow = arrow.now()print(now.shift(hours=5).time())print(now.shift(days=5).date())print(now.shift(years=-8).date())
夏令时
import arrownow = arrow.now()print(now.format("YYYY-MM-DD HH:mm:ss ZZ"))print(now.dst())
人性化的日期和时间
在社交网站上,我们经常可以看到诸如“一个小时前”或“ 5 分钟前”之类的术语,这些术语可以为人们提供有关帖子创建或修改时间的快速信息。Arrow 包含humanize()方法来创建此类术语。
import arrownow = arrow.now()d1 = now.shift(minutes=-15).humanize()print(d1)d2 = now.shift(hours=5).humanize()print(d2)
ISO 8601类
国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》,在API接口开发中涉及的比较多。
>>> import dateutil.parser>>> dateutil.parser.parse('2008-09-03T20:56:35.450686Z') # RFC 3339 formatdatetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc())>>> dateutil.parser.parse('2008-09-03T20:56:35.450686') # ISO 8601 extended formatdatetime.datetime(2008, 9, 3, 20, 56, 35, 450686)>>> dateutil.parser.parse('20080903T205635.450686') # ISO 8601 basic formatdatetime.datetime(2008, 9, 3, 20, 56, 35, 450686)>>> dateutil.parser.parse('20080903') # ISO 8601 basic format, date onlydatetime.datetime(2008, 9, 3, 0, 0)
或者使用如下方式解析:
>>> datetime.datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")
公历转农历:https://pypi.python.org/pypi/LunarSolarConverter/ 口语化日期:https://github.com/scrapinghub/dateparser Moment:https://github.com/zachwill/moment Delorean:https://github.com/myusuf3/delorean When:https://whenpy.readthedocs.io/en/latest/ Pendulum:https://pendulum.eustace.io/ 时间机器:https://github.com/spulec/freezegun 工作日历:https://github.com/peopledoc/workalendar 中国法定节假日:https://github.com/NateScarlet/holiday-cn
热门推荐