主頁 > 後端開發 > 日期與時間處理詳解

日期與時間處理詳解

2021-02-07 13:51:51 後端開發

https://www.biaodianfu.com/wp-content/uploads/2020/10/python-datetime.png

時間相關概念

在1967年的第13屆國際度量衡會議上決定以原子時定義的秒作為時間的國際標準單位:銫133原子基態的兩個超精細能階間躍遷對應輻射的9,192,631,770個周期的持續時間, 起始歷元定在1958年1月1日0時,

原子鐘是一種時鐘,它以原子共振頻率標準來計算及保持時間的準確,原子鐘是世界上已知最準確的時間測量和頻率標準,

GMT 格林威治標準時間(Greenwich Mean Time),是指位于倫敦郊區的皇家格林威治天文臺的標準時間,因為本初子午線(Prime meridian)被定義為通過那里的經線,GMT也叫世界時UT,

UTC 協調世界時間(Coordinated Universal Time), 又稱世界標準時間,基于國際原子鐘,誤差為每日數納秒,協調世界時的秒長與原子時的秒長一致,在時刻上則要求盡量與世界時接近(規定二者的差值保持在 0.9秒以內),

閏秒 不只有閏年,還有閏秒,閏秒是指為保持協調世界時接近于世界時時刻,由國際計量局統一規定在年底或年中(也可能在季末)對協調世界時增加或減少1秒的調整,由于地球自轉的不均勻性和長期變慢性(主要由潮汐摩擦引起的),會使世界時(民用時)和原子時之間相差超過到±0.9秒時,就把世界時向前撥1秒(負閏秒,最后一分鐘為59秒)或向后撥1秒(正閏秒,最后一分鐘為61秒); 閏秒一般加在公歷年末或公歷六月末,

時區 是地球上的區域使用同一個時間定義,有關國際會議決定將地球表面按經線從南到北,劃分成24個時區,并且規定相鄰區域的時間相差1小時,當人們跨過一個區域,就將自己的時鐘校正1小時(向西減1小時,向東加1小時),跨過幾個區域就加或減幾小時,比如我大中國處于東八區,表示為GMT+8,

夏令時 (Daylight Saving Time:DST),又稱日光節約時制、日光節約時間或夏令時間,這是一種為節約能源而人為規定地方時間的制度,在夏天的時候,白天的時間會比較長,所以為了節約用電,因此在夏天的時候某些地區會將他們的時間定早一小時,也就是說,原本時區是8點好了,但是因為夏天太陽比較早出現,因此把時間向前挪,在原本8點的時候,訂定為該天的9點(時間提早一小時)~如此一來,我們就可以利用陽光照明,省去了花費電力的時間,因此才會稱之為夏季節約時間!

Unix時間戳 指的是從協調世界時(UTC)1970年1月1日0時0分0秒開始到現在的總秒數,不考慮閏秒,

Python time模塊

在 Python 檔案里,time是歸類在Generic Operating System Services中,換句話說, 它提供的功能是更加接近于作業系統層面的,通讀檔案可知,time 模塊是圍繞著 Unix Timestamp 進行的,

該模塊主要包括一個類 struct_time,另外其他幾個函式及相關常量, 需要注意的是在該模塊中的大多數函式是呼叫了所在平臺C library的同名函式, 所以要特別注意有些函式是平臺相關的,可能會在不同的平臺有不同的效果,另外一點是,由于是基于Unix Timestamp,所以其所能表述的日期范圍被限定在 1970 – 2038 之間,如果你寫的代碼需要處理在前面所述范圍之外的日期,那可能需要考慮使用datetime模塊更好,

https://www.biaodianfu.com/wp-content/uploads/2020/10/python-time.jpg

獲取當前時間和轉化時間格式

  • 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)

struct_time共有9個元素,其中前面6個為年月日時分秒,后面三個分別代表的含義為:

  • tm_wday 一周的第幾天(周日是0)
  • tm_yday 一年的第幾天
  • tm_isdst 是否是夏令時

時間格式化

time.mktime()

將一個以struct_time格式轉換為時間戳

time.mktime(time.localtime())

1473388585.0

time.strftime(format[,t]) 把一個struct_time時間轉化為格式化的時間字串,如果t未指定,將傳入time.localtime(),如果元組中任何一個元素越界,ValueError的錯誤將會被拋出,

  • %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'

time.strptime(string[,format])

把一個格式化時間字串轉化為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)

計時器功能

time.sleep(secs)

執行緒推遲指定的時間運行,單位為秒,

time.clock()

這個需要注意,在不同的系統上含義不同,在UNIX系統上,它回傳的是“行程時間”,它是用秒表示的浮點數(時間戳),而在WINDOWS中,第一次呼叫,回傳的是行程運行的實際時間,而第二次之后的呼叫是自第一次呼叫以后到現在的運行時間,(實際上是以WIN32上QueryPerformanceCounter()為基礎,它比毫秒表示更為精確)

import time

time.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-06

clock2:1.00064381867

clock3:2.00158724394

其中第一個clock()輸出的是程式運行時間,第二、三個clock()輸出的都是與第一個clock的時間間隔

time模塊其他內置函式

  • altzone() 回傳格林威治西部的夏令時地區的偏移秒數,如果該地區在格林威治東部會回傳負值(如西歐,包括英國),對夏令時啟用地區才能使用,
  • tzset() 根據環境變數TZ重新初始化時間相關設定,

time模塊包含的屬性

  • timezone 是當地時區(未啟動夏令時)距離格林威治的偏移秒數(>0,美洲;<=0大部分歐洲,亞洲,非洲),
  • tzname 包含一對根據情況的不同而不同的字串,分別是帶夏令時的本地時區名稱和不帶的,

import time

print(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模塊

datetime 比 time 高級了不少,可以理解為 datetime 基于 time 進行了封裝,提供了更多實用的函式,

https://www.biaodianfu.com/wp-content/uploads/2020/10/python-datetime-module.png

datetime模塊定義了下面這幾個類:

  • date:表示日期的類,常用的屬性有year, month, day
  • time:表示時間的類,常用的屬性有hour, minute, second, microsecond
  • datetime:表示日期時間
  • timedelta:表示時間間隔,即兩個時間點之間的長度
  • tzinfo:與時區有關的相關資訊

注:上面這些型別的物件都是不可變(immutable)的,

date類

date類定義了一些常用的類方法與類屬性:

  • max、min:date物件所能表示的最大、最小日期
  • resolution:date物件表示日期的最小單位,這里是天
  • today():回傳一個表示當前本地日期的date物件
  • fromtimestamp(timestamp):根據給定的時間戮,回傳一個date物件
  • fromordinal(ordinal):將Gregorian日歷時間轉換為date物件(特殊歷法用不上)

from datetime import date

import time

print('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-31

date.min: 0001-01-01

date.resolution: 1 day, 0:00:00

date.today(): 2016-09-12

date.fromtimestamp(): 2016-09-12

date提供的實體方法和屬性:

  • .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 date

today = 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

date還對某些操作進行了多載,它允許我們對日期進行如下一些操作:

  • date2 = date1 + timedelta # 日期加上一個間隔,回傳一個新的日期物件
  • date2 = date1 – timedelta # 日期減去一個間隔,回傳一個新的日期物件
  • timedelta = date1 – date2 # 兩個日期相減,回傳一個時間間隔物件
  • date1 < date2 # 兩個日期進行比較

time類

time類的建構式如下:(其中引數tzinfo,它表示時區資訊,)

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

time類定義的類屬性:

  • min、max:time類所能表示的最小、最大時間,其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999)
  • resolution:時間的最小單位,這里是1微秒

time類提供的實體方法和屬性:

  • .hour、.minute、.second、.microsecond:時、分、秒、微秒
  • .tzinfo:時區資訊
  • .replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):創建一個新的時間物件,用引數指定的時、分、秒、微秒代替原有物件中的屬性(原有物件仍保持不變);
  • .isoformat():回傳型如”HH:MM:SS”格式的字串表示;
  • .strftime(fmt):回傳自定義格式化字串,

像date一樣,也可以對兩個time物件進行比較,或者相級訓傳一個時間間隔物件,這里就不提供例子了,

datetime類

datetime是date與time的結合體,包括date與time的所有資訊,它的建構式如下:datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]),各引數的含義與date、time的建構式中的一樣,要注意引數值的范圍,

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 datetime

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.max: 9999-12-31 23:59:59.999999

datetime.min: 0001-01-01 00:00:00

datetime.resolution: 0:00:00.000001

today(): 2016-09-12 19:57:00.761000

now(): 2016-09-12 19:57:00.761000

utcnow(): 2016-09-12 11:57:00.761000

fromtimestamp(tmstmp): 2016-09-12 19:57:00.761000

utcfromtimestamp(tmstmp): 2016-09-12 11:57:00.761000

datetime類提供的實體方法與屬性(很多屬性或方法在date和time中已經出現過,在此有類似的意義,這里只羅列這些方法名,具體含義不再逐個展開介紹,可以參考上文對date與time類的講解,):

year、month、day、hour、minute、second、microsecond、tzinfo:

  • 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)

像date一樣,也可以對兩個datetime物件進行比較,或者相級訓傳一個時間間隔物件,或者日期時間加上一個間隔回傳一個新的日期時間物件,

timedelta類

通過timedelta函式回傳一個timedelta物件,也就是一個表示時間間隔的物件,函式引數情況如下所示:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

其沒有必填引數,簡單控制的話第一個整數就是多少天的間隔的意思:

datetime.timedelta(10)

兩個時間間隔物件可以彼此之間相加或相減,回傳的仍是一個時間間隔物件,而更方便的是一個datetime物件如果減去一個時間間隔物件,那么回傳的對應減去之后的datetime物件,然后兩個datetime物件如果相級訓傳的是一個時間間隔物件,這很是方便,

tzinfo類

tzinfo是一個抽象類,不能被直接實體化,需要派生子類,提供相應的標準方法,datetime模塊并不提供tzinfo的任何子類,最簡單的方式是使用pytz模塊,

pytz模塊

pytz是Python的一個時區處理模塊(同時也包括夏令時),在理解時區處理模塊之前,需要先要了解一些時區的概念,

https://www.biaodianfu.com/wp-content/uploads/2020/10/timezone.jpg

要知道時區之間的轉換關系,其實這很簡單:把當地時間減去當地時區,剩下的就是格林威治時間了,例如北京時間的18:00就是18:00+08:00,相減以后就是10:00+00:00,因此就是格林威治時間的10:00,

Python的datetime可以處理2種型別的時間,分別為offset-naive和offset-aware,前者是指沒有包含時區資訊的時間,后者是指包含時區資訊的時間,只有同型別的時間才能進行減法運算和比較,

datetime模塊的函式在默認情況下都只生成offset-naive型別的datetime物件,例如now()、utcnow()、fromtimestamp()、utcfromtimestamp()和strftime(),其中now()和fromtimestamp()可以接受一個tzinfo物件來生成offset-aware型別的datetime物件,但是標準庫并不提供任何已實作的tzinfo類,只能自己實作,

下面就是實作格林威治時間和北京時間的tzinfo類的例子:

ZERO_TIME_DELTA = timedelta(0)

LOCAL_TIME_DELTA = timedelta(hours=8) # 本地時區偏差

class UTC(tzinfo):

def utcoffset(self, dt):

return ZERO_TIME_DELTA

def dst(self, dt):

return ZERO_TIME_DELTA

class LocalTimezone(tzinfo):

def utcoffset(self, dt):

return LOCAL_TIME_DELTA

def dst(self, dt):

return ZERO_TIME_DELTA

def tzname(self, dt):

return '+08:00'

一個tzinfo類需要實作utcoffset、dst和tzname這3個方法,其中utcoffset需要回傳夏時令的時差調整;tzname需要回傳時區名,如果你不需要用到的話,也可以不實作,

一旦生成了一個offset-aware型別的datetime物件,我們就能呼叫它的astimezone()方法,生成其他時區的時間(會根據時差來計算),而如果拿到的是offset-naive型別的datetime物件,也是可以呼叫它的replace()方法來替換tzinfo的,只不過這種替換不會根據時差來調整其他時間屬性,因此,如果拿到一個格林威治時間的offset-naive型別的datetime物件,直接呼叫replace(tzinfo=UTC())即可轉換成offset-aware型別,然后再呼叫astimezone()生成其他時區的datetime物件,

看上去一切都很簡單,但不知道你還是否記得上文所述的夏時令,提起夏時令這個玩意,真是讓我頭疼,因為它沒有規則可循:有的國家實行夏時令,有的國家不實行,有的國家只在部分地區實行夏時令,有的地區只在某些年實行夏時令,每個地區實行夏時令的起止時間都不一定相同,而且有的地方TMD還不是用幾月幾日來指定夏時令的起止時間的,而是用某月的第幾個星期幾這種形式,

pytz模塊,使用Olson TZ Database解決了跨平臺的時區計算一致性問題,解決了夏令時帶來的計算問題,由于國家和地區可以自己選擇時區以及是否使用夏令時,所以pytz模塊在有需要的情況下得更新自己的時區以及夏令時相關的資訊,

pytz提供了全部的timezone資訊,如:

import pytz

print(len(pytz.all_timezones))

print(len(pytz.common_timezones))

運行結果:

588

436

如果需要獲取某個國家的時區,可以使用如下方式:

import pytz

print(pytz.country_timezones('cn'))

執行結果:

[u'Asia/Shanghai', u'Asia/Urumqi']

中國一個有兩個時區,一個為上海,一個為烏魯木齊,我們來看下我們有什么區別:

from datetime import datetime

import pytz

print(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/Shanghai

2016-09-14 09:55:39.384000+08:00

Asia/Urumqi

2016-09-14 07:55:39.385000+06:00

可以看到上海是東八區,而烏魯木齊是東六區,

時區轉換

操作起來有而比較簡單,本地時區與UTC的互轉:

from datetime import datetime

import pytz

now = 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:00

2016-09-14 02:25:44.633000+00:00

使用astimezone()可以進行時區與時區之間的轉換,

from datetime import datetime

import pytz

utc = pytz.utc

beijing_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:00

UTC: 2016-09-14 02:19:22.671000+00:00

JAPAN TIME: 2016-09-14 11:19:22.671000+09:00

另外可以采用 replace來修改時區,時區多出6分鐘(不要使用),具體原因為:

民國17年(1928年),國民政府統一中國,原中央觀象臺的業務由南京政府中央研究院的天文研究所和氣象研究所分別接收,天文研究所編寫的曆書基本上沿襲中央觀象臺的做法,仍將全國劃分為5個標準時區,只是在有關交氣、合朔、太陽出沒時刻等處,不再使用北平的地方平時,而改以南京所在的標準時區的區時即東經120°標準時替代,從北平地方平時改為東經120°標準時,兩者相差了352秒,

from datetime import datetime

import pytz

now = datetime.now()

print(now)

tz = pytz.timezone('Asia/Shanghai')

print(now.replace(tzinfo=tz))

執行結果:

2016-09-14 10:29:20.200000

2016-09-14 10:29:20.200000+08:06

夏令時處理

由于用到的場景比較少,不做細化學習,

dateutil模塊

安裝模塊:pip install Python-dateutil

parser.parse()

決議時間到datetime格式,支持大部分時間字串,沒指定時間默認是0點,沒指定日期默認是今天,沒指定年份默認是今年,

from dateutil import parser

print(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:00

2004-03-08 00:00:00

2004-03-08 00:00:00

2004-03-08 00:00:00

2016-09-14 00:00:00

2016-09-14 00:00:00

2016-09-14 00:00:00

2016-09-14 00:00:00

2016-09-09 00:00:00

2016-09-14 12:00:00

2016-11-12 00:00:00

rrule.rrule()

函式主要功能:按照規則生成日期和時間,函式原型如下,

rrule(self, freq, dtstart=None, interval=1, wkst=None, count=None, until=None, bysetpos=None, bymonth=None, bymonthday=None, byyearday=None, byeaster=None, byweekno=None, byweekday=None, byhour=None, byminute=None, bysecond=None, cache=False)

其中:

  • 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,即周一到周日,

更多參考:http://dateutil.readthedocs.io/en/stable/index.html

Arrow

Arrow 提供了一個友好而且非常易懂的方法,用于創建時間、計算時間、格式化時間,還可以對時間做轉化、提取、兼容 python datetime 型別,它包括dateutil模塊,根據其檔案描述Arrow旨在“幫助你使用更少的代碼來處理日期和時間”,

UTC 時間

使用utcnow()功能創建 UTC 時間,

使用to()方法,我們將 UTC 時間轉換為本地時間,

import arrow

utc = arrow.utcnow()

print(utc)

print(utc.to('local'))

當地時間

本地時間是特定區域或時區中的時間,

import arrow

now = arrow.now()

print(now)

print(now.to('UTC'))

使用now()功能創建本地時間, to()方法用于將本地時間轉換為 UTC 時間,

決議時間

get()方法用于決議時間,

import arrow

d1 = arrow.get('2012-06-05 16:20:03', 'YYYY-MM-DD HH:mm:ss')

print(d1)

d2 = arrow.get(1504384602)

print(d2)

該示例從日期和時間字串以及時間戳決議時間,

Unix 時間戳

import arrow

utc = arrow.utcnow()

print(utc)

unix_time = utc.timestamp

print(unix_time)

date = arrow.Arrow.fromtimestamp(unix_time)

print(date)

該示例顯示本地時間和 Unix 時間, 然后,它將 Unix 時間轉換回 date 物件,

使用fromtimestamp()方法,我們將 Unix 時間轉換回 Arrow 日期物件,

也可以將日期格式化為 Unix 時間,

import arrow

utc = arrow.utcnow()

print(utc.format('X'))

通過將’X’說明符傳遞給format()方法,我們將當前本地日期列印為 Unix 時間,

格式化日期和時間

日期和時間可以用format()方法格式化,

import arrow

now = 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))

格式說明:

https://www.biaodianfu.com/wp-content/uploads/2020/10/Arrow.png

轉換為區域時間

import arrow

utc = 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 arrow

d1 = arrow.get('1948-12-13')

print(d1.weekday())

print(d1.format('dddd'))

移動時間

shift()方法用于移動時間,

import arrow

now = arrow.now()

print(now.shift(hours=5).time())

print(now.shift(days=5).date())

print(now.shift(years=-8).date())

夏令時

import arrow

now = arrow.now()

print(now.format("YYYY-MM-DD HH:mm:ss ZZ"))

print(now.dst())

該示例使用dst()顯示夏令時,

人性化的日期和時間

在社交網站上,我們經常可以看到諸如“一個小時前”或“ 5 分鐘前”之類的術語,這些術語可以為人們提供有關帖子創建或修改時間的快速資訊, Arrow 包含humanize()方法來創建此類術語,

import arrow

now = 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 format

datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc())

dateutil.parser.parse('2008-09-03T20:56:35.450686') # ISO 8601 extended format

datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)

dateutil.parser.parse('20080903T205635.450686') # ISO 8601 basic format

datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)

dateutil.parser.parse('20080903') # ISO 8601 basic format, date only

datetime.datetime(2008, 9, 3, 0, 0)

或者使用如下方式決議:

datetime.datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

另外還可以使用iso8601模塊:http://pyiso8601.readthedocs.io/en/latest/

其他日期與時間工具:

  • 公歷轉農歷: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

原文鏈接: https://www.biaodianfu.com/python-datetime.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257461.html

標籤:python

上一篇:ShapeNet簡介和下載、binvox檔案python示例

下一篇:[python]微信公眾號JS逆向

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more