格林尼治標准時間
協調世界時,又稱世界統一時間、世界標准時間、國際協調時間。
協調世界時是以原子時秒長為基礎,在時刻上盡量接近於世界時的一種時間計量系統。
CST可視為美國、澳大利亞、古巴或中國的標准時間。
CST可以為如下4個不同的時區的縮寫:
是一種時間的表示方法,國際標准化組織的國際標准ISO 8601是日期和時間的表示方法,全稱為《數據存儲和交換形式·信息交換·日期和時間的表示方法》。
UTC+08 就是中國的時間。
轉換一個時間元組為字符串, 例如,返回’Sat Jun 06 16:26:11 1998’.
時間戳轉化為表示本地時間的字符串,例如,返回’Sat Jun 06 16:26:11 1998’.
時間戳轉化為utc時間結構體,例如
時間戳轉化為本地時間結構體
將struct_time轉為時間戳(秒)
格式化時間元組或時間結構體為字符串
import time
print(time.strftime("%Y-%m-%S",time.localtime()))
# 2022-06-24
將時間字符串轉化為時間結構體
import time
print(time.strptime("2022-06-24","%Y-%m-%S"))
# time.struct_time(tm_year=2022, tm_mon=6, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=24, tm_wday=2, tm_yday=152, tm_isdst=-1)
秒,毫秒,微秒,納秒,進制1k,不再贅述
datetime庫是time庫的擴展
常用屬性:
創建對象:
常用方法:
import datetime
# 2022-06-20 14:55:31.718297
print(datetime.datetime.utcnow())
# 2022-06-20 22:55:31.718297
print(datetime.datetime.now())
----------------------------------------
now = datetime.datetime.now()
utc_now = datetime.datetime.utcnow()
# 2022-06-20T22:59:11.174310
print(now.isoformat())
---------------------------------------
# 1
print(now.isoweekday())
----------------------------------------
# (2022, 25, 1)
print(now.isocalendar())
---------------------------------------
# 23:04:30.648577
print(now.time())
# 2022-06-20
print(now.date())
---------------------------------------
# 2022
print(now.strftime("%Y"))
--------------------------------------
# time.struct_time(tm_year=2022, tm_mon=6, tm_mday=20, tm_hour=23, tm_min=8, tm_sec=2, tm_wday=0, tm_yday=171, tm_isdst=-1)
print(now.timetuple())
-----------------------------------------
# 2022-06-20 23:09:02.547208+08:00
print(now.astimezone())
----------------------------------------
# 23:22:47.514078
print(now.timetz())
方法,屬性與datetime.datetime相同
一般不用
允許對時間加減了
import datetime
now = datetime.datetime.now()
# 2022-06-20 23:16:56.884229
print(now)
live = now + datetime.timedelta(seconds=10)
# 2022-06-20 23:17:06.884229
print(live)
# False
var = now > live
print(var)
timezone類繼承與基類tzinfo,它的每個實例都表示一個由UTC的固定偏移量定義的時區。
from datetime import datetime, timezone, timedelta
tz1 = timezone(timedelta(hours=3), name='East 3')
dt = datetime(2019, 11, 21, 15, 12, 52, tzinfo = tz1)
# dt = datetime.datetime(2019, 11, 21, 15, 12, 52, tzinfo=datetime.timezone(datetime.timedelta(seconds=10800), 'East 3'))
dt.tzname()
# 'East 3'
timezone.utc
# datetime.timezone.utc
time包提供了時間的顯示和測量用的函數。日歷的計算采用的是公歷。
time.Time類型表示時間。
func timeDemo() {
now := time.Now() //獲取當前時間
fmt.Printf("current time:%v\n", now)
year := now.Year() //年
month := now.Month() //月
day := now.Day() //日
hour := now.Hour() //小時
minute := now.Minute() //分鐘
second := now.Second() //秒
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
時間戳是自1970年1月1日(08:00:00GMT)至當前時間的總毫秒數。它也被稱為Unix時間戳(UnixTimestamp)。
func timestampDemo() {
now := time.Now() //獲取當前時間
timestamp1 := now.Unix() //時間戳
timestamp2 := now.UnixNano() //納秒時間戳
fmt.Printf("current timestamp1:%v\n", timestamp1)
fmt.Printf("current timestamp2:%v\n", timestamp2)
}
使用time.Unix()函數可以將時間戳轉為時間格式。
func timestampDemo2(timestamp int64) {
timeObj := time.Unix(timestamp, 0) //將時間戳轉為時間格式
fmt.Println(timeObj)
year := timeObj.Year() //年
month := timeObj.Month() //月
day := timeObj.Day() //日
hour := timeObj.Hour() //小時
minute := timeObj.Minute() //分鐘
second := timeObj.Second() //秒
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
舉例
func main(){
now:=time.Now().Unix()
// 1655739004
fmt.Println(now)
timeObj:=time.Unix(now,0)
// 2022-06-20 23:30:04 +0800 CST
fmt.Println(timeObj)
}
time.Duration是time包定義的一個類型,它代表兩個時間點之間經過的時間,以納秒為單位。time.Duration表示一段時間間隔,可表示的最長時間段大約290年。
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
Go 語言中使用 location 來映射具體的時區。時區(Time Zone)是根據世界各國家與地區不同的經度而劃分的時間定義,全球共分為24個時區。中國差不多跨5個時區,但為了使用方便只用東八時區的標准時即北京時間為准。
// timezoneDemo 時區示例
func timezoneDemo() {
// 中國沒有夏令時,使用一個固定的8小時的UTC時差。
// 對於很多其他國家需要考慮夏令時。
secondsEastOfUTC := int((8 * time.Hour).Seconds())
// FixedZone 返回始終使用給定區域名稱和偏移量(UTC 以東秒)的 Location。
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
// 如果當前系統有時區數據庫,則可以加載一個位置得到對應的時區
// 加載紐約所在的時區
newYork, err := time.LoadLocation("America/New_York") // UTC-05:00
// 加載上海所在的時區
shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00
// 加載東京所在的時區
tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00
// 創建時間對象需要指定位置。常用的位置是 time.Local(當地時間) 和 time.UTC(UTC時間)。
timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)
timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing)
sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)
// 北京時間(東八區)比UTC早8小時,所以上面兩個時間看似差了8小時,但表示的是同一個時間
timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
// true
fmt.Println(timesAreEqual)
// 紐約(西五區)比UTC晚5小時,所以上面兩個時間看似差了5小時,但表示的是同一個時間
timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
// true
fmt.Println(timesAreEqual)
}
func main() {
now := time.Now()
later := now.Add(time.Hour) // 當前時間加1小時後的時間
fmt.Println(later)
}
func (t Time) Sub(u Time) Duration
func (t Time) Equal(u Time) bool
func (t Time) Before(u Time) bool
func (t Time) After(u Time) bool
返回一個time.C管道,time.Duration後會在此管道中放入一個時間點
func After(d Duration) <-chan Time {
return NewTimer(d).C
}
func Tick(d Duration) <-chan Time {
if d <= 0 {
return nil
}
return NewTicker(d).C
}
func tickDemo() {
ticker := time.Tick(time.Second) //定義一個1秒間隔的定時器
for i := range ticker {
fmt.Println(i)//每秒都會執行的任務
}
}
計時器NewTimer是等待多長時間觸發的,只觸發一次
func NewTimer(d Duration) *Timer {
c := make(chan Time, 1)
t := &Timer{
C: c,
r: runtimeTimer{
when: when(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}
func NewTicker(d Duration) *Ticker {
if d <= 0 {
panic(errors.New("non-positive interval for NewTicker"))
}
c := make(chan Time, 1)
t := &Ticker{
C: c,
r: runtimeTimer{
when: when(d),
period: int64(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}
等待時間函數AfterFunc是在After基礎上加了一個回調函數
time.AfterFunc(time.Second*1, F)
time.Format函數能夠將一個時間對象格式化輸出為指定布局的文本表示形式,需要注意的是 Go 語言中時間格式化的布局不是常見的Y-m-d H:M:S,而是使用 2006-01-02 15:04:05.000(記憶口訣為2006 1 2 3 4 5)。
// formatDemo 時間格式化
func formatDemo() {
now := time.Now()
// 格式化的模板為 2006-01-02 15:04:05
// 24小時制
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
// 12小時制
fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
// 小數點後寫0,因為有3個0所以格式化輸出的結果也保留3位小數
fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960
// 小數點後寫9,會省略末尾可能出現的0
fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96
// 只格式化時分秒部分
fmt.Println(now.Format("15:04:05"))
// 只格式化日期部分
fmt.Println(now.Format("2006.01.02"))
}
對於從文本的時間表示中解析出時間對象,time包中提供了time.Parse和time.ParseInLocation兩個函數。
其中time.Parse在解析時不需要額外指定時區信息。
// parseDemo 指定時區解析時間
func parseDemo() {
// 在沒有時區指示符的情況下,time.Parse 返回UTC時間
timeObj, err := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC
// 在有時區指示符的情況下,time.Parse 返回對應時區的時間表示
// RFC3339 = "2006-01-02T15:04:05Z07:00"
timeObj, err = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST
}
// parseDemo 解析時間
func parseDemo() {
now := time.Now()
fmt.Println(now)
// 加載時區
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
// 按照指定時區和指定格式解析字符串時間
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/10/05 11:25:20", loc)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(timeObj)
fmt.Println(timeObj.Sub(now))
}