主頁 > 後端開發 > python工具模塊介紹-time 時間訪問和轉換

python工具模塊介紹-time 時間訪問和轉換

2023-04-25 07:44:34 後端開發

快速入門

In [1]: import time

# 獲取當前時間
In [25]: time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime()) 
Out[25]: '2018-06-17_20-05-36'
# 停頓0.5秒
In [26]: time.sleep(0.5)

簡介

功能:時間訪問和轉換,

相關模塊:

datetime 標準模塊,
calendar 標準模塊,

下面介紹一些術語和約定:

epoch是時間開始點,對于Unix ,時代是1970年1月1日0點,通過time.gmtime(0)可以查看時間的起點:

In [1]: import time

In [2]: time.gmtime(0)
Out[2]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

In [3]:  time.gmtime(time.time() + 786041553) # 32位會報錯
Out[3]: time.struct_time(tm_year=2043, tm_mon=5, tm_mday=8, tm_hour=6, tm_min=26, tm_sec=50, tm_wday=4, tm_yday=128, tm_isdst=0)

對于32位的linux系統,時間只能處理到2038年,現在新發布的主流已經全部是64位版本,

UTC是協調世界時(前身為格林威治標準時間或GMT),

DST為夏令時,通常是根據當地法律在一年內的部分時間進行一小時的調整, C庫包含有當地規則的表,

實時函式的精度可能比建議的要低,例如在大多數Unix系統中,時鐘“滴答”只有50或100次每秒,

不過time()和sleep()比Unix的更好:時間為浮點數,time()的回傳確保最精確(盡量使用Unix的函式gettimeofday()) ,sleep()接受的時間為非零分數(盡量用select()實作) ,

gmtime(), localtime()和strptime()的回傳是包含9個整數的序列,可以作為asctime(), mktime() and strftime()的輸入,每個域都有自己的屬性,實際上是一個結構體struct_time,參見上面的例子,

時間轉換:gmtime()把浮點時間轉為UTC的struct_time,反之calendar.timegm();localtime()把浮點時間轉為local的struct_time,反之mktime(),實際上calendar.timegm()和mktime()是等效的,不過前者回傳整數,后者回傳浮點數,

時間生成與轉換

生成epoch的浮點數,注意不同的系統精度不同,linux一般是小數點后面7為,windows一般是小數點后3位,Time函式是沒有引數的,可以直接對回傳的浮點數進行計算,
gmtime([secs])把浮點時間轉為UTC的struct_time,如果無輸入引數為慷訓呼叫time()讀取當前時間,
gmtime顯示的是世界協調時間, localtime([secs])可以顯示本地時間,
注意夏時制要設定dst,asctime([t])顯示時間為可讀性好的格式,它把gmtime(), localtime()和strptime()的回傳的struct_time型別轉換為可讀性較好的格式,如果輸入引數為空則呼叫localtime()的回傳結果,它和c函式不同的地方是末尾不會添加換行,asctime不會使用Locale資訊,

ctime([secs])在asctime上更進一步,轉換浮點數為可讀性較好的格式,相當于asctime(localtime(secs)), 這個功能很常用,ctime不會使用Locale資訊,

In [1]: import time

In [2]: time.gmtime(0)
Out[2]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

In [3]:  time.gmtime(time.time() + 786041553)
Out[3]: time.struct_time(tm_year=2043, tm_mon=5, tm_mday=8, tm_hour=6, tm_min=26, tm_sec=50, tm_wday=4, tm_yday=128, tm_isdst=0)

In [4]: time.time()
Out[4]: 1528637996.277831

In [5]: time.gmtime()
Out[5]: time.struct_time(tm_year=2018, tm_mon=6, tm_mday=10, tm_hour=13, tm_min=42, tm_sec=47, tm_wday=6, tm_yday=161, tm_isdst=0)

In [6]: time.localtime()
Out[6]: time.struct_time(tm_year=2018, tm_mon=6, tm_mday=10, tm_hour=21, tm_min=43, tm_sec=54, tm_wday=6, tm_yday=161, tm_isdst=0)

In [7]: time.asctime()
Out[7]: 'Sun Jun 10 22:10:14 2018'

In [8]: time.ctime()
Out[8]: 'Sun Jun 10 22:12:25 2018'

Sleep

sleep(secs)暫停執行指定秒數,引數可以是整數或浮點數,實際的中止時間可能小于請求時間,因為例行的信號捕捉可能終止sleep,此外中止時間可能長于請求時間,因為因為系統調度也是需要時間的,

In [36]: time.sleep(3)

處理器時間

clock()在Unix上,回傳當前的處理器時間,為以秒表示的浮點數,精度決于同名的C函式,通常用于基準Python或定時的演算法,我們書寫一個不耗cpu和耗cpu的腳本對比:

import time

template = '{} - {:0.2f} - {:0.2f}'

print(template.format(
    time.ctime(), time.time(), time.clock())
)

for i in range(3, 0, -1):
    print('Sleeping', i)
    time.sleep(i)
    print(template.format(
        time.ctime(), time.time(), time.clock())
    )

執行結果:

$ python3 time_clock_sleep.py 
Mon Jun 18 01:27:52 2018 - 1529256472.83 - 0.05
Sleeping 3
Mon Jun 18 01:27:55 2018 - 1529256475.83 - 0.05
Sleeping 2
Mon Jun 18 01:27:57 2018 - 1529256477.83 - 0.05
Sleeping 1
Mon Jun 18 01:27:58 2018 - 1529256478.83 - 0.05

import hashlib
import time

# Data to use to calculate md5 checksums
data = https://www.cnblogs.com/testing-/p/open(__file__,'rb').read()

for i in range(5):
    h = hashlib.sha1()
    print(time.ctime(), ': {:0.3f} {:0.3f}'.format(
        time.time(), time.clock()))
    for i in range(300000):
        h.update(data)
    cksum = h.digest()

執行結果:

$ python3 time_clock.py 
Mon Jun 18 01:31:35 2018 : 1529256695.695 0.048
Mon Jun 18 01:31:36 2018 : 1529256696.166 0.519
Mon Jun 18 01:31:36 2018 : 1529256696.635 0.987
Mon Jun 18 01:31:37 2018 : 1529256697.110 1.461
Mon Jun 18 01:31:37 2018 : 1529256697.587 1.936

struct_time類

struct_time是的命名元組,結構如下:

| 索引(Index) | 屬性(Attribute) | 值(Values) |
| 0 | tm_year(年 | 比如2013 |
| 1 | tm_mon(月) | 1 - 12 |
| 2 | tm_mday(日) | 1 - 31 |
| 3 | tm_hour(時) | 0 - 23 |
| 4 | tm_min(分) | 0 - 59 |
| 5 | tm_sec(秒) | 0 - 61 |
| 6 | tm_wday(weekday | 0 - 6(0表示周日 |
| 7 | tm_yday(一年中的第幾天) | 1 - 366 |
| 8 | tm_isdst(是否是夏令時) | 默認為-1 |

import timedef show_struct(s):
    print '  tm_year :', s.tm_year    print '  tm_mon  :', s.tm_mon    print '  tm_mday :', s.tm_mday    print '  tm_hour :', s.tm_hour    print '  tm_min  :', s.tm_min    print '  tm_sec  :', s.tm_sec    print '  tm_wday :', s.tm_wday    print '  tm_yday :', s.tm_yday    print '  tm_isdst:', s.tm_isdstprint 'gmtime:'show_struct(time.gmtime())print '\nlocaltime:'show_struct(time.localtime())print '\nmktime:', time.mktime(time.localtime())

執行結果:

$ python3 time_struct.py 
gmtime:
  tm_year : 2018
  tm_mon  : 6
  tm_mday : 17
  tm_hour : 17
  tm_min  : 32
  tm_sec  : 54
  tm_wday : 6
  tm_yday : 168
  tm_isdst: 0

localtime:
  tm_year : 2018
  tm_mon  : 6
  tm_mday : 18
  tm_hour : 1
  tm_min  : 32
  tm_sec  : 54
  tm_wday : 0
  tm_yday : 169
  tm_isdst: 0

mktime: 1529256774.0

參考資料

參考資料

  • python好書下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • https://docs.python.org/3/library/time.html
  • https://pymotw.com/3/time/index.html
  • http://effbot.org/librarybook/time.htm
  • 代碼地址

時區

重置庫函式的時間轉換規則,實際上是修改環境變數TZ,python 2.3以后類linux支持該功能,這個功能相對不是那么常用,TZ環境變數的格式如下:

std offset [dst [offset [,start[/time], end[/time]]]]

STD和DST為時區縮寫,hh[:mm[:ss]],表示加上這個時間可以得到UTC時間,偏移量的形式為: HH [ : MM [ : SS] ],夏時制增加1小時,

starttime, endtime表示使用夏時制的區間,time和偏移類似,默認時間是02:00:00,比如:

In [1]: import os

In [2]: import time

In [3]: os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'

In [4]: time.tzset()

In [5]: time.strftime('%X %x %Z')
Out[5]: '13:38:26 06/17/18 EDT'

In [6]: os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'

In [7]: time.tzset()

In [8]: time.strftime('%X %x %Z')
Out[8]: '03:38:46 06/18/18 AEST'

在許多Unix系統(包括* BSD,Linux和Solaris,和Darwin),使用系統時區資料庫更方便,

In [9]: os.environ['TZ'] = 'US/Eastern'

In [10]:  time.tzset()

In [11]: time.tzname
Out[11]: ('EST', 'EDT')

In [12]:  os.environ['TZ'] = 'Egypt'

In [13]:  time.tzset()

In [14]: ('EET', 'EEST')
Out[14]: ('EET', 'EEST')

另一實體:

import time
import os
def show_zone_info():
    print '  TZ    :', os.environ.get('TZ', '(not set)')
    print '  tzname:', time.tzname    print '  Zone  : %d (%d)' % (time.timezone,
                                 (time.timezone / 3600))
    print '  DST   :', time.daylight    print '  Time  :', time.ctime()
    printprint 'Default :'show_zone_info()ZONES = [ 'GMT',
          'Europe/Amsterdam',
          ]for zone in ZONES:
    os.environ['TZ'] = zone
    time.tzset()
    print zone, ':'
    show_zone_info()

執行結果:

$ python3 time_timezone.py 
Default :
  TZ    : (not set)
  tzname: ('CST', 'CST')
  Zone  : -28800 (-8.0)
  DST   : 0
  Time  : Mon Jun 18 01:40:39 2018

GMT :
  TZ    : GMT
  tzname: ('GMT', 'GMT')
  Zone  : 0 (0.0)
  DST   : 0
  Time  : Sun Jun 17 17:40:39 2018

Europe/Amsterdam :
  TZ    : Europe/Amsterdam
  tzname: ('CET', 'CEST')
  Zone  : -3600 (-1.0)
  DST   : 1
  Time  : Sun Jun 17 19:40:39 2018

格式化

time.strftime(format[, t]):把一個代表時間的元組或者struct_tim轉為格式化的時間字串,如果t未指定,將呼叫time.localtime()的回傳作為輸入,如果輸入中任何一個元素越界將報ValueError例外,格式化引數如下:

格式 含義 備注
%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 秒(01 - 61)
%U 周數(基于年)(00 – 53周日是星期的開始,)第一個周日之前的所有天數都放在第0周,
%w 星期中的天數(0 - 6,0是星期天)
%W 和%U基本相同,以星期一為星期的開始,
%x 本地相應日期表示
%X 本地相應時間表示
%y 去掉世紀的年份(00 - 99)
%Y 完整的年份
%Z 時區的名字(如果不存在為空字符)
%% '%’字符

備注:

  • “%p”只有與“%I”配合使用才有效果,

  • 秒是0 - 61,而不是59,以處理閏秒和雙閏秒,

  • 當使用strptime()函式時,只有當在這年中的周數和天數被確定的時候%U和%W才會被計算,

比如:

In [15]: time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
Out[15]: 'Sun, 17 Jun 2018 17:44:12 +0000'

下面方式在給檔案名等添加時間戳比較有用:

In [17]: time.strftime("%Y-%m-%d_%H:%M:%S", time.gmtime())
Out[17]: '2018-06-17_17:46:18'

顯示格式可能因系統而又不同的差異,

time.strptime(string[, format]):把一個格式化時間字串轉化為struct_time,實際上它和strftime()是逆操作,引數參見strftime,Format默認為"%a %b %d %H:%M:%S %Y",和ctime的回傳格式一致,沒有提供的值會采用默認值(1900, 1, 1, 0, 0, 0, 0, 1, -1),

In [19]: time.strptime("30 Nov 18", "%d %b %y")
    ...: 
Out[19]: time.struct_time(tm_year=2018, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=334, tm_isdst=-1)

其他

altzone屬性查看當前夏時制時間的偏移,daylight屬性查看是否使用了夏時制,timezone查看當前時區的偏移,Tzname回傳本地時區和夏時制對應的時區,

In [3]: time.altzone
Out[3]: -28800
In [4]: time.daylight
Out[4]: 0
In [5]: time.timezone
Out[5]: -28800
In [6]: time.tzname
Out[6]: ('CST', 'CST')
釘釘或微信號: pythontesting 微信公眾號:pythontesting

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

標籤:Python

上一篇:Springboot啟動原理和自動配置原理

下一篇:返回列表

標籤雲
其他(157978) Python(38095) JavaScript(25390) Java(17999) C(15217) 區塊鏈(8259) C#(7972) AI(7469) 爪哇(7425) MySQL(7140) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5328) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4559) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2430) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1960) Web開發(1951) HtmlCss(1923) python-3.x(1918) 弹簧靴(1913) C++(1911) xml(1889) PostgreSQL(1873) .NETCore(1855) 谷歌表格(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
最新发布
  • python工具模塊介紹-time 時間訪問和轉換

    快速入門 In [1]: import time # 獲取當前時間 In [25]: time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime()) Out[25]: '2018-06-17_20-05-36' # 停頓0.5秒 In [26]: time. ......

    uj5u.com 2023-04-25 07:44:34 more
  • Springboot啟動原理和自動配置原理

    放本地檔案夾都快吃土了,準備清理檔案夾,關于Springboot的! 啟動原理 @SpringBootApplication public class Start { public static void main(String[] args) { SpringApplication.run(Sta ......

    uj5u.com 2023-04-25 07:44:08 more
  • OpenAI ChatGPT 能取代多少程式員的作業?導致失業嗎?

    閱讀原文:https://bysocket.com/openai-chatgpt-vs-developer/ ChatGPT 能取代多少程式員的作業?導致我們程式員失業嗎?這是一個很好的話題,我這里分享下: 一、ChatGPT 是什么?有什么作用 ChatGPT是一種基于人工智能技術的語言模型,是可 ......

    uj5u.com 2023-04-25 07:44:01 more
  • docker-compose一鍵部署java開源專案

    這一年干的很多事都是為了降低我的開源專案訊息推送平臺austin使用門檻。 如果想學Java專案的,強烈推薦我的開源專案訊息推送平臺Austin(8K stars) ,可以用作畢業設計,可以用作校招,可以看看生產環境是怎么推送訊息的。開源專案訊息推送平臺austin倉庫地址: 訊息推送平臺🔥推送下 ......

    uj5u.com 2023-04-25 07:43:55 more
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Mave ......

    uj5u.com 2023-04-25 07:43:51 more
  • Redis Plus 來了,性能炸裂!

    來源:https://developer.aliyun.com/article/705239 1 什么是KeyDB? KeyDB是Redis的高性能分支,專注于多執行緒,記憶體效率和高吞吐量。除了多執行緒之外,KeyDB還具有僅在Redis Enterprise中可用的功能,例如Active Replic ......

    uj5u.com 2023-04-25 07:43:39 more
  • skywalking自定義插件開發

    skywalking是使用位元組碼操作技術和AOP概念攔截Java類方法的方式來追蹤鏈路的,由于skywalking已經打包了位元組碼操作技術和鏈路追蹤的背景關系傳播,因此只需定義攔截點即可。 這里以skywalking-8.7.0版本為例。 關于插件攔截的原理,可以看我的另一篇文章:skywalking ......

    uj5u.com 2023-04-25 07:43:31 more
  • SpringCloud Gateway 3.x 回應頭添加 Skywalking TraceId

    在微服務架構中,一次請求可能會被多個服務處理,而每個服務又會產生相應的日志,且每個服務也會有多個實體。在這種情況下,如果系統發生例外,沒有 Trace ID,那么在進行日志分析和追蹤時就會非常困難,因為我們無法將所有相關的日志資訊串聯起來。 如果將 Trace ID 添加到回應頭中,那么在進行日志分 ......

    uj5u.com 2023-04-25 07:43:26 more
  • 一文詳解RocketMQ-Spring的原始碼決議與實戰

    摘要:這篇文章主要介紹 Spring Boot 專案使用 rocketmq-spring SDK 實作訊息收發的操作流程,同時筆者會從開發者的角度解讀 SDK 的設計邏輯。 本文分享自華為云社區《RocketMQ-Spring : 實戰與原始碼決議一網打盡》,作者:勇哥java實戰分享。 Rocket ......

    uj5u.com 2023-04-25 07:43:00 more
  • Java的final修飾符

    可以將實體域定義為 final。對于 final 域來說,構建物件時必須初始化 final 實體域,構造物件之后就不允許改變 final 實體域的值了。

    final 類和 final 方法用來阻止繼承。 ......

    uj5u.com 2023-04-25 07:42:08 more