python time、datetime模块学习使用

    在做题的时候遇上几个题目需要将Timestamp、Datetime、UTC几个时间之间做转换,正好之前了解到python提供了极为便捷强大的时间处理模块,掌握好了用起来就会很方便,在这里花一点时间专门在网上搜集的资料,整理一下,内容来源于网上,放在这里,最主要是作为学习的记录,方便以后用到的时候不需要费力再去耗费时间去查询了,也希望能给需要的朋友提供方便,给出来了参考的来源,如果需要还可以直接去源网站去学习:
#!/usr/bin/env python
#encoding:utf-8

'''
参考来源:
http://www.jb51.net/article/111303.htm
http://www.jb51.net/article/31129.htm
http://www.jb51.net/article/63654.htm
http://www.jb51.net/article/67828.htm
功能:
Python的时间模块datetime学习使用
介绍:
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime
datetime模块定义了两个常量:datetime.MINYEAR和datetime.MAXYEAR,分别
表示datetime所能表示的最小、最大年份。其中,MINYEAR = 1,MAXYEAR = 9999。
datetime模块定义了5个类,分别是
1.datetime.date:表示日期的类
2.datetime.datetime:表示日期时间的类
3.datetime.time:表示时间的类
4.datetime.timedelta:表示时间间隔,即两个时间点的间隔
5.datetime.tzinfo:时区的相关信息
-----------------------------------------------------------------------------------------
一、首先看一下datetime.date类:
date类有三个参数,datetime.date(year,month,day),返回year-month-day
方法:
1.datetime.date.ctime(),返回格式如 Sun Apr 16 00:00:00 2017
2.datetime.date.fromtimestamp(timestamp),根据给定的时间戮,返回一个date对象;datetime.date.today()作用相同
3.datetime.date.isocalendar():返回格式如(year,month,day)的元组,(2017, 15, 6)
4.datetime.date.isoformat():返回格式如YYYY-MM-DD
5.datetime.date.isoweekday():返回给定日期的星期(0-6),星期一=0,星期日=6
6.datetime.date.replace(year,month,day):替换给定日期,但不改变原日期
7.datetime.date.strftime(format):把日期时间按照给定的format进行格式化。
8.datetime.date.timetuple():返回日期对应的time.struct_time对象
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=15, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=105, tm_isdst=-1)
9.datetime.date.weekday():返回日期的星期
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的time类
time类有5个参数,datetime.time(hour,minute,second,microsecond,tzoninfo),返回08:29:30
1.datetime.time.replace()
2.datetime.time.strftime(format):按照format格式返回时间
3.datetime.time.tzname():返回时区名字
4.datetime.time.utcoffset():返回时区的时间偏移量
三、datetime的datetime类
datetime类有很多参数,datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),返回年月日,时分秒
datetime.datetime.ctime()
datetime.datetime.now().date():返回当前日期时间的日期部分
datetime.datetime.now().time():返回当前日期时间的时间部分
datetime.datetime.fromtimestamp()
datetime.datetime.now():返回当前系统时间
datetime.datetime.replace()
datetime.datetime.strftime():由日期格式转化为字符串格式
datetime.datetime.now().strftime('%b-%d-%Y %H:%M:%S')
'Apr-16-2017 21:01:35'
datetime.datetime.strptime():由字符串格式转化为日期格式
datetime.datetime.strptime('Apr-16-2017 21:01:35', '%b-%d-%Y %H:%M:%S')
2017-04-16 21:01:35
四、datetime的timedelta类
datetime.datetime.timedelta用于计算两个日期之间的差值
'''

from datetime import * 
import time 

print 'date.max:', date.max 
print 'date.min:', date.min 
print 'date.today():', date.today() 
print 'date.fromtimestamp():', date.fromtimestamp(time.time()) 


now = date(2010, 04, 06) 
tomorrow = now.replace(day = 07) 
print 'now:', now, ', tomorrow:', tomorrow 
print 'timetuple():', now.timetuple() 
print 'weekday():', now.weekday() 
print 'isoweekday():', now.isoweekday() 
print 'isocalendar():', now.isocalendar() 
print 'isoformat():', now.isoformat() 

'''
date还对某些操作进行了重载,它允许我们对日期进行如下一些操作: 

•date2 = date1 + timedelta # 日期加上一个间隔,返回一个新的日期对象(timedelta将在下面介绍,表示时间间隔) 
•date2 = date1 - timedelta # 日期隔去间隔,返回一个新的日期对象 
•timedelta = date1 - date2 # 两个日期相减,返回一个时间间隔对象 
•date1 < date2 # 两个日期进行比较 
注:对日期进行操作时,要防止日期超出它所能表示的范围。 
'''
now = date.today() 
tomorrow = now.replace(day = 7) 
delta = tomorrow - now 
print 'now:', now, ' tomorrow:', tomorrow 
print 'timedelta:', delta 
print now + delta 
print tomorrow > now 


'''
Time类 
time类表示时间,由时、分、秒以及微秒组成。(我不是从火星来的~~)time类的构造函数如下: 

class datetime.time(hour[, minute[, second[, microsecond[, tzinfo]]]]) :各参数的意义不作
解释,这里留意一下参数tzinfo,它表示时区信息。注意一下各参数的取值范围:hour的范围为
[0, 24),minute的范围为[0, 60),second的范围为[0, 60),microsecond的范围为[0, 1000000)。 

time类定义的类属性: 

•time.min、time.max:time类所能表示的最小、最大时间。其中,time.min = time(0, 0, 0, 0), 
time.max = time(23, 59, 59, 999999); 
•time.resolution:时间的最小单位,这里是1微秒; 
time类提供的实例方法和属性: 

•time.hour、time.minute、time.second、time.microsecond:时、分、秒、微秒; 
•time.tzinfo:时区信息; 
•time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个新的时间对象,
用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变); 
•time.isoformat():返回型如"HH:MM:SS"格式的字符串表示; 
•time.strftime(fmt):返回自定义格式化字符串
'''

from datetime import * 
tm = time(23, 46, 10) 
print 'tm:', tm 
print 'hour: %d, minute: %d, second: %d, microsecond: %d' % (tm.hour, tm.minute, tm.second, tm.microsecond) 
tm1 = tm.replace(hour = 20) 
print 'tm1:', tm1 
print 'isoformat():', tm.isoformat() 

'''
datetime类 
datetime是date与time的结合体,包括date与time的所有信息。它的构造函数如下:
datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]),
各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。 

datetime类定义的类属性与方法: 

•datetime.min、datetime.max:datetime所能表示的最小值与最大值; 
•datetime.resolution:datetime最小单位; 
•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对象; 
'''

from datetime import * 
import time 

print '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.year、month、day、hour、minute、second、microsecond、tzinfo: 
•datetime.date():获取date对象; 
•datetime.time():获取time对象; 
•datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]): 
•datetime.timetuple() 
•datetime.utctimetuple() 
•datetime.toordinal() 
•datetime.weekday() 
•datetime.isocalendar() 
•datetime.isoformat([sep]) 
•datetime.ctime():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple())); 
•datetime.strftime(format) 
像date一样,也可以对两个datetime对象进行比较,或者相减返回一个时间间隔对象,或者日期时间加上一个间隔返回一个新的日期时间对象。这里不提供详细的例子,看客自己动手试一下~~ 

格式字符串 
datetime、date、time都提供了strftime()方法,该方法接收一个格式字符串,输出日期时间的字符串表示。下表是从python手册中拉过来的,我对些进行了简单的翻译(翻译的有点噢口~~)。 

格式字符 意义 

%a星期的简写。如 星期三为Web 
%A星期的全写。如 星期三为Wednesday 
%b月份的简写。如4月份为Apr 
%B月份的全写。如4月份为April 
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39) 
%d: 日在这个月中的天数(是这个月的第几天) 
%f: 微秒(范围[0,999999]) 
%H: 小时(24小时制,[0, 23]) 
%I: 小时(12小时制,[0, 11]) 
%j: 日在年中的天数 [001,366](是当年的第几天) 
%m: 月份([01,12]) 
%M: 分钟([00,59]) 
%p: AM或者PM 
%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~) 
%U: 周在当年的周数当年的第几周),星期天作为周的第一天 
%w: 今天在这周的天数,范围为[0, 6],6表示星期天 
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天 
%x: 日期字符串(如:04/07/10) 
%X: 时间字符串(如:10:43:39) 
%y: 2个数字表示的年份 
%Y: 4个数字表示的年份 
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串) 
%Z: 时区名称(如果是本地时间,返回空字符串) 
%%: %% => % 
'''
dt = datetime.now() 
print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f') 
print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p') 
print '%%a: %s ' % dt.strftime('%a') 
print '%%A: %s ' % dt.strftime('%A') 
print '%%b: %s ' % dt.strftime('%b') 
print '%%B: %s ' % dt.strftime('%B') 
print '日期时间%%c: %s ' % dt.strftime('%c') 
print '日期%%x:%s ' % dt.strftime('%x') 
print '时间%%X:%s ' % dt.strftime('%X') 
print '今天是这周的第%s天 ' % dt.strftime('%w') 
print '今天是今年的第%s天 ' % dt.strftime('%j') 
print '今周是今年的第%s周 ' % dt.strftime('%U') 


#Python中datetime常用时间处理方法
import datetime
# 获取当前时间
d1 = datetime.datetime.now()
print d1
# 当前时间加上半小时
d2 = d1 + datetime.timedelta(hours=0.5)
print d2
# 格式化字符串输出
d3 = d2.strftime('%Y-%m-%d %H:%M:%S')
print d3
# 将字符串转化为时间类型
# d4 = datetime.datetime.strptime(date,'%Y-%m-%d %H:%M:%S.%f')
# print d4
#获取本周和本月第一天的日期:


def first_day_of_month():
  '''
  获取本月第一天
  :return:
  '''
  # now_date = datetime.datetime.now()
  # return (now_date + datetime.timedelta(days=-now_date.day + 1)).replace(hour=0, minute=0, second=0,
  # microsecond=0)
  return datetime.date.today() - datetime.timedelta(days=datetime.datetime.now().day - 1)
def first_day_of_week():
  '''
  获取本周第一天
  :return:
  '''
  return datetime.date.today() - datetime.timedelta(days=datetime.date.today().weekday())

#now方法有个参数tz,设置时区类型。如果没有和方法today的效果一样
now = datetime.datetime.now()
#UTC时间
datetime.datetime.utcnow()
attrs = [
("year","年"),('month',"月"),("day","日"),('hour',"小时"),( 'minute',"分"),( 'second',"秒"),( 'microsecond',"毫秒"),(
'min',"最小"),( 'max',"最大"),
]
for k,v in attrs:
  "now.%s = %s #%s" % (k,getattr(now, k),v)


if __name__ == "__main__":
  this_week = first_day_of_week()
  last_week = this_week - datetime.timedelta(days=7)
  this_month = first_day_of_month()
  last_month = this_month - datetime.timedelta(days=(this_month - datetime.timedelta(days=1)).day)
  print this_week
  print last_week
  print this_month
  print last_month


简单跑一下结果:

date.max: 9999-12-31
date.min: 0001-01-01
date.today(): 2017-04-19
date.fromtimestamp(): 2017-04-19
now: 2010-04-06 , tomorrow: 2010-04-07
timetuple(): time.struct_time(tm_year=2010, tm_mon=4, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=96, tm_isdst=-1)
weekday(): 1
isoweekday(): 2
isocalendar(): (2010, 14, 2)
isoformat(): 2010-04-06
now: 2017-04-19  tomorrow: 2017-04-07
timedelta: -12 days, 0:00:00
2017-04-07
False
tm: 23:46:10
hour: 23, minute: 46, second: 10, microsecond: 0
tm1: 20:46:10
isoformat(): 23:46:10
datetime.max: 9999-12-31 23:59:59.999999
datetime.min: 0001-01-01 00:00:00
datetime.resolution: 0:00:00.000001
today(): 2017-04-19 09:48:00.346997
now(): 2017-04-19 09:48:00.347013
utcnow(): 2017-04-19 01:48:00.347024
fromtimestamp(tmstmp): 2017-04-19 09:48:00.347030
utcfromtimestamp(tmstmp): 2017-04-19 01:48:00.347041
(%Y-%m-%d %H:%M:%S %f):  2017-04-19 09:48:00 347047
(%Y-%m-%d %H:%M:%S %p):  17-04-19 09:48:00 AM
%a: Wed 
%A: Wednesday 
%b: Apr 
%B: April 
日期时间%c: Wed Apr 19 09:48:00 2017 
日期%x:04/19/17 
时间%X:09:48:00 
今天是这周的第3天 
今天是今年的第109天 
今周是今年的第16周 
2017-04-19 09:48:00.347196
2017-04-19 10:18:00.347196
2017-04-19 10:18:00
2017-04-17
2017-04-10
2017-04-01
2017-03-01


接下来这个是几个时间的转换程序,来自于http://www.jb51.net/article/63654.htm在这里只是出于学习的目的,作为自己的代码笔记:

#coding=utf-8

'''
python Timestamp、Datetime、UTC时间之间转换练习
'''

import time
import datetime

#一、Datetime转化为TimeStamp
def datetime2timestamp(dt, convert_to_utc=False):
  ''' Converts a datetime object to UNIX timestamp in milliseconds. '''
  if isinstance(dt, datetime.datetime):
    if convert_to_utc: # 是否转化为UTC时间
      dt = dt + datetime.timedelta(hours=-8) # 中国默认时区
    timestamp = total_seconds(dt - EPOCH)
    return long(timestamp)
  return dt


#二、TimeStamp转化为Datetime
def timestamp2datetime(timestamp, convert_to_local=False):
  ''' Converts UNIX timestamp to a datetime object. '''
  if isinstance(timestamp, (int, long, float)):
    dt = datetime.datetime.utcfromtimestamp(timestamp)
    if convert_to_local: # 是否转化为本地时间
      dt = dt + datetime.timedelta(hours=8) # 中国默认时区
    return dt
  return timestamp


#三、当前UTC时间的TimeStamp
def timestamp_utc_now():
  return datetime2timestamp(datetime.datetime.utcnow())


#四、当前本地时间的TimeStamp
def timestamp_now():
  return datetime2timestamp(datetime.datetime.now())


#五、UTC时间转化为本地时间
# 需要安装python-dateutil
# Ubuntu下:sudo apt-get install python-dateutil
# 或者使用PIP:sudo pip install python-dateutil
from dateutil import tz
from dateutil.tz import tzlocal
from datetime import datetime
 
# get local time zone name
print datetime.now(tzlocal()).tzname()
 
# UTC Zone
from_zone = tz.gettz('UTC')
# China Zone
to_zone = tz.gettz('CST')
 
utc = datetime.utcnow()
 
# Tell the datetime object that it's in UTC time zone
utc = utc.replace(tzinfo=from_zone)
 
# Convert time zone
local = utc.astimezone(to_zone)
print datetime.strftime(local, "%Y-%m-%d %H:%M:%S")




# def get_prev_timestamp(tart_ts, interval = 3):
#     start_array = datetime.datetime.utcfromtimestamp(start_ts)
#     start_array = start_array + datetime.timedelta(hours=8)
#     prev_time = (start_array - datetime.timedelta(days = interval))
#     prev_ts = int(time.mktime(prev_time.timetuple()))

#     return prev_ts

# def get_end_timestamp(start_ts, interval = 30):
#     start_date = datetime.datetime.utcfromtimestamp(start_ts)
#     start_date = start_date + datetime.timedelta(hours=8)
#     end_date = start_date + datetime.timedelta(minutes = interval)
#     end_ts = int(time.mktime(end_date.timetuple()))

#     return end_ts

# def get_seven_day_ago( day = 7):
#     human = {'d':86400 }
#     now = int(time.time())
#     ts = now - day * human['d']

#     return str(ts)

# start_ts = time.time()


# print get_seven_day_ago()

简单跑一下结果:

CST
2017-04-19 09:50:02  

       感觉datetime模块很强大,在python项目中经常会用到的,熟练地掌握一些极为有用的函数在以后的工作中对于工作效率的提升帮助是很大的。

你可能感兴趣的:(python time、datetime模块学习使用)