Python進階篇:8 內置模塊time/datetime/calendar/arrow日期時間

1、time模塊

import time
'''時間的表示形式:
1、時間戳:
     以整型或者浮點型表示的是一個以秒爲單位的時間間隔,這個時間的基礎值是1970年1月1日0時開始計算

2、元組形式
    一種python的數據結構表示,這個元組有9個整型元素,分別表示不同的時間含義:
  year、month(1-12)、day(1-31)、hours(0-23)、minutes(0-59)、seconds(0-59)、weekday(0-6,注意星期一爲0)、
  Julian day(1-366):表示當前日期在本年的第幾天
  DST flag(-1 or 0 or 1):夏令時格式,0表示正常格式,1表示夏令時,-1表示根據當前的日期時間格式來自動判定。

3、格式化字符串

%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-59
%U   一年中的星期數
%w  一個星期中第幾天(0-6,0表示星期天)
%W   和%U基本相同
%x  本地相應的日期
%X   本地相應的時間
%y 去掉世紀的年份(00-99)
%Y  完整的年份
%Z  時區的名稱,如果不存在爲空字符串


'''
# 返回當前的時間戳,浮點數形式,無需傳參
t1 = time.time()
print(t1) # 1562748091.1303322

# gmtime()將時間戳轉換爲UTC時間元組格式,接收一個浮點型時間戳爲參數,如果不傳默認爲當前時間的時間戳
t2 = time.gmtime()
print(t2) # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=10, tm_hour=8, tm_min=45, tm_sec=10, tm_wday=2, tm_yday=191, tm_isdst=0)

# localtime()將時間戳轉換爲本地時間元組
t3 = time.localtime()
print(t3) # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=10, tm_hour=16, tm_min=45, tm_sec=10, tm_wday=2, tm_yday=191, tm_isdst=0)

# mktime() 將本地時間元組轉換爲時間戳,接收一個本地時間元組
t4 = time.mktime(t3)
print(t4) # 1562748406.0


# asctime()將時間元組轉換爲字符串形式,接收一個本地時間元組
t5 = time.asctime(t3)
print(t5) # 返回值類型字符串,Wed Jul 10 16:48:55 2019

# ctime()將時間戳轉換爲字符串,接收一個時間戳,默認參數爲當前時間戳
t6 = time.ctime()
print(t6) # 返回值類型字符串,Wed Jul 10 16:50:11 2019

# strftime()表示string fomate tieme;將時間元組以指定格式轉換爲字符串形式;第一個參數接收一個字符串格式,第二個參數爲時間元組默認爲本地的時間元組
t7 = time.strftime("%Y-%m-%d %X",time.localtime()) # %X等同於%H:%M:%S
# t7 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print(t7) # 2019-07-11 09:55:30
t7_1 =time.strftime("%x %H:%M:%S",time.localtime())
print(t7_1) # 07/11/19 09:57:27

#strptime():string prase time
#將指定格式的時間字符串轉換爲時間元組,是strftime的逆過程
t8= time.strptime("1997-07-01 10:12:20","%Y-%m-%d %H:%M:%S")
print(t8) # time.struct_time(tm_year=1997, tm_mon=7, tm_mday=1, tm_hour=10, tm_min=12, tm_sec=20, tm_wday=1, tm_yday=182, tm_isdst=-1)

#clock() 返回當前的程序執行時間,unix系統始終返回全部運行的時間,而windows從第二次開始都是以第一次調用次函數的時間戳爲準。

2、datetime模塊

"""
datetime比time模塊高級不少,可以理解爲datetime基於time進行封裝,提供了更實用的函數接口,
datetime模塊的接口更直觀,更容易調用
"""
import datetime
'''
datetime模塊中的類:
(1)time:關注時間
(2)date:關注日期
(3)datetime:同時有時間和日期
(4)timedelta:主要用於計算時間跨度
(5)tzinfo:時區相關
(6)timezone:
'''
# 獲取當前時間
t1= datetime.datetime.now()
print(t1,type(t1)) # 2019-07-11 10:11:01.157269 <class 'datetime.datetime'>

# 獲取指定時間
t2=datetime.datetime(2019,7,11,10,11,0,0)
print(t2) # 2019-07-11 10:11:00

# 將時間轉換爲字符串,這個常用
t3= t1.strftime("%Y-%m-%d %X")
print(t3,type(t3)) # 2019-07-11 10:51:20 <class 'str'>

#將格式化字符串轉換爲datetime對象
t4 = datetime.datetime.strptime(t3,'%Y-%m-%d %X')
print(t4,type(t4)) # 2019-07-11 10:52:28 <class 'datetime.datetime'>

# 時間是可以相減的
t5 = datetime.datetime(2019,7,10,23,12,5,0)
t6 =datetime.datetime(2019,7,11,10,54,0,0)
t7 = t6-t5
print(t7,type(t7)) # 11:41:55 <class 'datetime.timedelta'>
print(t7.days) # 間隔天數
print(t7.seconds) # 除去間隔天數以外的間隔秒數
print(t7.microseconds)

【datetime例子】

import datetime
if __name__ == '__main__':
    #1、today()和now()獲取當前日期和時間,時間精度到毫秒
    print(datetime.datetime.today()) #datetime.datetime類型 2020-02-22 11:09:26.349982
    print(datetime.datetime.now()) # 2020-02-22 11:11:13.960383
    #2、使用strftime()格式化時間爲標準格式,年份Y大寫。
    print(datetime.datetime.now().strftime("%Y-%m-%d")) # 2020-02-22
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) #2020-02-22 11:13:48
    # 3、倒計時使用strptime對象
    day20 = datetime.datetime.strptime('2020-03-03 0:0:0','%Y-%m-%d %H:%M:%S')
    now = datetime.datetime.today()
    delta = day20 - now # delta存儲兩個時間的時間,差精度到毫秒
    day = delta.days # 獲取兩個時間之間的天數
    hour = int(delta.seconds/60/60) #使用int把小時取整
    minute = int((delta.seconds - hour *60*60)/60) # 分鐘取整
    seconds = delta.seconds - hour*60*60 -minute*60 # 秒取整
    print("距離2020-03-03還有{}天{}小時{}分鐘{}秒".format(str(day),str(hour),str(minute),str(seconds)))

    #4、計算未來或過去 需要timedelta對象
    print("5天后是幾號:",datetime.datetime.now() + datetime.timedelta(days=5))
    print("10天前是幾號:",datetime.datetime.now() - datetime.timedelta(days=10))
    print("20個小時候:",datetime.datetime.now() + datetime.timedelta(hours=20))
    print("500分鐘後:",datetime.datetime.now() + datetime.timedelta(minutes=500))
    m_time = datetime.datetime.now() + datetime.timedelta(minutes=500)
    print(m_time.strptime('%Y-%m-%d'))

3、calendar模塊

# 日曆模塊
import calendar
#返回指定年的某月
print(calendar.month(2019,7)) #

# 返回指定年的日曆
print(calendar.calendar(2019))

# 判斷某一年是否是閏年
print(calendar.isleap(2019)) # False

# 返回某個月的weekday的第一天和這個月的所有天數
print(calendar.monthrange(2019,6))# 返回元組,第一個值表示這個月的第一個是weekday


#返回某個月以一週爲週期的元組序列
print(calendar.monthcalendar(2018,12)) # [[0, 0, 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, 0, 0, 0, 0, 0]]

4、arrow日期模塊

pip install arrow
【1獲取當前時間arrow.utcnow()和  arrow.now()】

import arrow
# <class 'arrow.arrow.Arrow'> 2019-10-18T03:02:00.390265+00:00
print(type(arrow.utcnow()),arrow.utcnow())
# arrow.now()類型爲arrow.arrow.Arrow;結果爲 2019-10-18T10:42:14.842503+08:00
print(type(arrow.now()),arrow.now()) #

【2將時間戳轉化爲arrow對象】
將時間戳轉化爲arrow對象需要使用get()方法;arrow.get(timestamp) 。
>>> arrow.get(1519534533) 
<Arrow [2018-02-25T04:55:33+00:00]> 
>>> arrow.get('1519534533') 
<Arrow [2018-02-25T04:55:33+00:00]>  
>>> arrow.get(1519534533.153443)
<Arrow [2018-02-25T04:55:33.153443+00:00]>  
>>> arrow.get('1519534533.153443')

【將字符串轉換爲arrow對象】
將字符串轉換爲arrow對象;arrow.get(string[,format_string])

import arrow
d0 = arrow.get('2018-02-24 12:30:45', 'YYYY-MM-DD HH:mm:ss')
print(d0) # 2018-02-24T12:30:45+00:00

【arrow對象屬性】

import arrow
obj_arrow = arrow.utcnow()
# <class 'datetime.datetime'> 2019-10-18 03:06:36.020147+00:00
print(type(obj_arrow.datetime),obj_arrow.datetime)
# <class 'int'> 1571368039
print(type(obj_arrow.timestamp),obj_arrow.timestamp)

# <class 'datetime.datetime'> 2019-10-18 03:08:00.016222
print(type(obj_arrow.naive),obj_arrow.naive)

【 獲取datetime對象的值】

import arrow
obj_arrow = arrow.utcnow()
print("當前時間年份",obj_arrow.year)
print("當前時間的月份",obj_arrow.month)
print("當前時間本月那天",obj_arrow.day)
print("當前時間小時",obj_arrow.hour)
print("當前時間的分鐘",obj_arrow.minute)
print("當前時間的秒數",obj_arrow.second)
print("當前時間的毫秒",obj_arrow.microsecond)

【時間推移】

#時間推移 shift(**kwargs)
import arrow
obj_arrow = arrow.utcnow()
# 2019-11-08T03:11:57.966314+00:00 <class 'arrow.arrow.Arrow'>
print("三週後",obj_arrow.shift(weeks=+3),type(obj_arrow.shift(weeks=+3)))
print("一天前",obj_arrow.shift(days=-1))
print("當前時間本月那天",obj_arrow.day)
print("當前時間小時",obj_arrow.hour)
print("當前時間的分鐘",obj_arrow.minute)
print("當前時間的秒數",obj_arrow.second)
print("當前時間的毫秒",obj_arrow.microsecond)

【時間替換replace(**kwargs)】

import arrow
obj_arrow = arrow.utcnow()
print("替換年份",obj_arrow.replace(year=2020))
print("替換月份",obj_arrow.replace(month=12))
print("替換天",obj_arrow.replace(day=12))
print("替換小時",obj_arrow.replace(hour=12))
print("替換分鐘",obj_arrow.replace(minute=59))
print("替換秒",obj_arrow.replace(second=1))

【格式化輸出 format([format_string])】

import arrow
obj_arrow = arrow.utcnow()
print(obj_arrow.format("YYYY-MM-DD HH:mm:ss ZZ"))
print(obj_arrow.format("YYYY-MM-DD"))

【人性化輸出humanize()】

import arrow
obj_arrow = arrow.utcnow()
past = obj_arrow.shift(hours=-1)
#locale參數可以指定地區語言
print(past.humanize(obj_arrow, locale='zh')) # 1小時前

【獲取某一年中的所有日期】

import arrow
def isLeapYear(years):
    '''
    通過判斷閏年,獲取年份years下一年的總天數
    :param years: 年份,int
    :return:days_sum,一年的總天數
    '''
    # 斷言:年份不爲整數時,拋出異常。
    assert isinstance(years, int), "請輸入整數年,如 2018"

    if ((years % 4 == 0 and years % 100 != 0) or (years % 400 == 0)):  # 判斷是否是閏年
        # print(years, "是閏年")
        days_sum = 366
        return days_sum
    else:
        # print(years, '不是閏年')
        days_sum = 365
        return days_sum


def getAllDayPerYear(years):
    '''
    獲取一年的所有日期
    :param years:年份
    :return:全部日期列表
    '''
    start_date = '%s-1-1' % years
    a = 0
    all_date_list = []
    days_sum = isLeapYear(int(years))
    print()
    while a < days_sum:
        b = arrow.get(start_date).shift(days=a).format("YYYY-MM-DD")
        a += 1
        all_date_list.append(b)
    # print(all_date_list)
    return all_date_list


if __name__ == '__main__':
    # years = "2001"
    # years = int(years)
    # # 通過判斷閏年,獲取一年的總天數
    # days_sum = isLeapYear(years)

    # 獲取一年的所有日期
    all_date_list = getAllDayPerYear("2000")
    print(all_date_list)

【獲取一個月的最後一天】

    def last_day_of_month(self,any_day):
        """
        獲取獲得一個月中的最後一天
        :param any_day: 任意日期 格式爲:2020-2-24
        :return: string
        """
        any_day = datetime.datetime.strptime(any_day,'%Y-%m-%d')
        next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
        #any_last_day datetime.datetime對象
        any_last_day = next_month - datetime.timedelta(days=next_month.day)
        return datetime.datetime.strftime(any_last_day,'%Y-%m-%d')

【把輸入一個日期範圍,得到每一天的日期】

# -*- coding: utf-8 -*-
# Version:python3.7
import datetime,time
def getBetweenDay(begin_date,end_date):
    """輸入一個日期範圍,得到每一天"""
    date_list = []
    begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
    end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    while begin_date <= end_date:
        date_str = begin_date.strftime("%Y-%m-%d")
        date_list.append(date_str)
        begin_date += datetime.timedelta(days=1)
    return date_list

date_list = getBetweenDay('2020-01-20','2020-02-20')
print(date_list)

【把日期範圍按照月爲單位切分】

# -*- coding: utf-8 -*-
# Version:python3.7
import datetime,calendar,time,re
def get_date_range_list(input_start_date, end_date):
    """
    獲取時間參數列表
    :param start_date: 起始月初時間 --> str
    :param end_date: 結束時間 --> str
    :return: date_range_list -->list
    """
    date_range_list = []
    start_date = re.sub(r"-(\d{1,2})$", "-01", input_start_date)
    startdate = datetime.datetime.strptime(start_date, '%Y-%m-%d')
    # startdate = datetime.date(start_date.year, start_date.month, 1)
    enddate = datetime.datetime.strptime(end_date, '%Y-%m-%d')
    input_lastmonth_firstday = datetime.date(enddate.year, enddate.month, day=1)  # 獲取輸入截止日期月份第一天
    input_last_year = enddate.year
    input_last_month = enddate.month

    while True:
        # =calendar.monthrange(startdate.year, startdate.month)[1]得到某一年某一月一共多少天
        next_month = startdate + datetime.timedelta(days=calendar.monthrange(startdate.year, startdate.month)[1])
        month_end = next_month - datetime.timedelta(days=1)
        # print(type(next_month),type(month_end))
        if month_end < enddate:
            date_range_list.append((datetime.datetime.strftime(startdate,
                                                               '%Y-%m-%d'),
                                    datetime.datetime.strftime(month_end,
                                                               '%Y-%m-%d')))
            startdate = next_month
        else:
            # 修改開始一段時間
            first_lasy_day = date_range_list[0][1]
            del (date_range_list[0])
            date_range_list.insert(0, (input_start_date, first_lasy_day))
            # 添加最一段時間
            date_range_list.append(
                (datetime.datetime.strftime(datetime.date(input_last_year, input_last_month, day=1),
                                            '%Y-%m-%d'), end_date))
            return date_range_list
if __name__ == '__main__':
    range_day = get_date_range_list("2019-08-20","2020-03-03")
    print(range_day)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章