【转载】Python时间处理

Python时间处理

原文地址1:https://zhuanlan.zhihu.com/p/23679915
原文地址2:https://segmentfault.com/a/1190000012112097

time模块

在time模块中,时间有三种表现形式:

  • 时间戳,一般指Unix时间戳,是从1970年开始到现在的秒数。
  • 本地时间的struct_time形式:一个长度为9的命名元组,第一位为年,第二位为月…
  • UTC时间的struct_time形式:一个长度为9的命名元组,类似于上个,只不过为UTC时间
    其中后两者的类型一致,区别在于一个是本地时间(localtime),一个是utc时间。

各种时间形式的获取方式:

print("time stamp:", time.time())         # 时间戳:1479193181.829338

print("local time:", time.localtime())    # struct_time类型的本地时间
time.struct_time(tm_year=2016, tm_mon=11, tm_mday=15, tm_hour=14, tm_min=59, tm_sec=41, tm_wday=1, tm_yday=320, tm_isdst=0)

print("utc time:", time.gmtime())         # struct_time类型的utc时间
time.struct_time(tm_year=2016, tm_mon=11, tm_mday=15, tm_hour=6, tm_min=59, tm_sec=41, tm_wday=1, tm_yday=320, tm_isdst=0)

各种时间形式和字符串之间的转换:

print(time.ctime(time_stamp))       # 时间戳转字符串(本地时间字符串)

print(time.asctime(local_time))     # struct_time类型的本地时间转字符串
print(time.asctime(utc_time))       # struct_time类型的utc时间转字符串

# struct_time类型的本地时间转字符串:自定义格式
print(time.strftime("%Y-%m-%d, %H:%M:%S, %w", local_time))
# struct_time类型的utc时间转字符串:自定义格式
print(time.strftime("%Y-%m-%d, %H:%M:%S, %w", utc_time))

struct_time = time.strptime("2016-11-15, 15:32:12, 2", "%Y-%m-%d, %H:%M:%S, %w")       # 字符串转struct_time类型

time模块详解

time模块

datetime模块

接下来再看datetime模块。datatime模块重新封装了time模块,提供更多接口。该模块中包含4个主要的类:

  • datetime.time:时间类,只包含时、分、秒、微秒等时间信息。
  • datetime.date:日期类,只包含年、月、日、星期等日期信息。
  • datetime.datetime:日期时间类,包含以上两者的全部信息。
  • datetime.timedelta:时间日期差值类,用来表示两个datetime之间的差值。

1 date类

datetime.date(year, month, day)
date.today():返回一个表示当前本地日期的date对象;
date.fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象;

# 方法和属性
d1 = date(2011,06,03)#date对象
d1.year、date.month、date.day:年、月、日;
d1.replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
d1.timetuple():返回日期对应的time.struct_time对象;
d1.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
d1.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
d1.isocalendar():返回格式如(year,month,day)的元组;
d1.isoformat():返回格式如'YYYY-MM-DD’的字符串;
d1.strftime(fmt):和time模块format相同

2 time类

datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ) 

# 方法和属性
t1 = datetime.time(10,23,15)#time对象
t1.hour、t1.minute、t1.second、t1.microsecond:时、分、秒、微秒;
t1.tzinfo:时区信息;
t1.replace([ hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变);
t1.isoformat():返回型如"HH:MM:SS"格式的字符串表示;
t1.strftime(fmt):同time模块中的format

3 datetime类

datetime相当于date和time结合起来。
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )

datetime.today():返回一个表示当前本地时间的datetime对象;
datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间
datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
datetime.combine(date, time):根据date和time,创建一个datetime对象;
datetime.strptime(date_string, format):将格式字符串转换为datetime对象;

#方法和属性
dt=datetime.now()#datetime对象
dt.year、month、day、hour、minute、second、microsecond、tzinfo:
dt.date():获取date对象;
dt.time():获取time对象;
dt. replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ]):
dt. timetuple ()
dt. utctimetuple ()
dt. toordinal ()
dt. weekday ()
dt. isocalendar ()
dt. isoformat ([ sep] )
dt. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
dt. strftime (format)

4 timedelta类
使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。

#coding:utf-8
from  datetime import *

dt = datetime.now()
#日期减一天
dt1 = dt + timedelta(days=-1)#昨天
dt2 = dt - timedelta(days=1)#昨天
dt3 = dt + timedelta(days=1)#明天
delta_obj = dt3-dt
print type(delta_obj),delta_obj#<type 'datetime.timedelta'> 1 day, 0:00:00
print delta_obj.days ,delta_obj.total_seconds()#1 86400.0

datetime模块
datetime模块.jpg

python日期月份相加减函数

def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, [31,29 if y%4==0 and not y%400==0 else 28,31,30,31,30,31,31,30,31,30,31][m-1])
    return date.replace(day=d,month=m, year=y)

datetime类型和时间戳、struct_time类型的相互转换

time_stamp = a_datetime_local.timestamp()    # datetime类型转时间戳
print(time_stamp)

a_datetime_local = datetime.datetime.fromtimestamp(time.time())     # 时间戳转datetime.datetime类型的本地时间
a_datetime_utc = datetime.datetime.utcfromtimestamp(time.time())    # 时间戳转datetime.datetime类型的utc时间
print(a_datetime_local, a_datetime_utc)

print(a_datetime_local.timetuple())     # datetime类型转struct_time类型
print(a_datetime_utc.utctimetuple())    # datetime类型转struct_time类型

calendar模块

# 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c
calendar.calendar(2017)

# 获取2017年11月周日历集合
>>> print calendar.monthcalendar(2017,11)
[[0, 0, 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, 0, 0, 0]]

# 获取2017年11月11日是星期几(0-6代表星期一到星期日)
>>> print calendar.weekday(2017,11,11)
5
# 判断是否为闰年
>>> print calendar.isleap(2012)
# 判断两个年份之间,润年的个数
>>> print calendar.leapdays(2000, 2014)
# 显示某月的所有周
>>> cal = calendar.Calendar()
>>> cal.monthdatescalendar(2015, 1)
# 显示某年的的所有周
>>> cal.yeardatescalendar(2015)
# 嵌套列表
[[0, 0, 0, 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, 0]]
>>> calendar.monthcalendar(2018,3)
# 显示某月份有几天
>>> print calendar.monthrange(2014, 11)
(5, 30)
(5, 30)解释:5表示201411月份的第一天是周六;30表示201411月份总共有30

获取本周/本月最后一天及第一天

>>> today = datetime.date.today()
# 获取本周第一天
>>> print today - datetime.timedelta(today.weekday())
2017-11-06
# 获取本周最后一天
>>> print today + datetime.timedelta(6-today.weekday())
2017-11-12
# 获取本月第一天
>>> print datetime.date(today.year, today.month, 1)
2017-11-01
# 获取本月最后一天
>>> first_day_weekday, last_day_num = calendar.monthrange(today.year, today.month)
>>> print datetime.date(today.year, today.month, last_day_num)
2017-11-30

python中日期转成字符串的格式详细说明如下:

python中时间日期格式化符号:
%y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身 

比datetime更好用的python时间处理库 arrow
时间处理库arrow

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值