在 Go 中,Time是一種用來描述某個時間點的型別。日期和時間資訊可以透過它的方法來存取、比較和操作,不過也有一些函式是直接在time套件上呼叫的。目前的日期和時間則可以透過time.Now函式取得。
time.Parse函式會把字串解析成Time型別的值。Go 有一套特別的方式,讓你定義解析時預期的格式。你需要用這個特殊時間戳記裡的值,寫出一個格式範例:Mon Jan 2 15:04:05 -0700 MST 2006。
例如:
import "time"
func parseTime() time.Time {
date := "Tue, 09/22/1995, 13:00"
layout := "Mon, 01/02/2006, 15:04"
t, err := time.Parse(layout,date) // time.Time, error
}
// => 1995-09-22 13:00:00 +0000 UTC
Time.Format()方法會回傳時間的字串表示。就和Parse函式一樣,目標格式同樣是透過範例來定義,而這個範例使用的是特殊時間戳記裡的值。
例如:
import (
"fmt"
"time"
)
func main() {
t := time.Date(1995,time.September,22,13,0,0,0,time.UTC)
formattedTime := t.Format("Mon, 01/02/2006, 15:04") // string
fmt.Println(formattedTime)
}
// => Fri, 09/22/1995, 13:00
如果想自訂格式,可以組合使用這些選項。在 Go 中,也有預先定義好的日期和時間戳記格式常數可以使用。
| 時間 | 選項 |
|---|---|
| 年 | 2006 ; 06 |
| 月 | Jan ; January ; 01 ; 1 |
| 日 | 02 ; 2 ; _2(表示前置的 0) |
| 星期 | Mon ; Monday |
| 小時 | 15(24 小時制);3;03(AM 或 PM) |
| 分鐘 | 04 ; 4 |
| 秒 | 05 ; 5 |
| AM/PM 標記 | PM |
| 一年中的第幾天 | 002 ; __2 |
time.Time型別有許多方法可以存取特定的時間,例如小時:Time.Hour()、月份:Time.Month()。關於實際運作方式的更多說明,可以參考官方文件。
time套件還包含另一種型別Duration,用來表示經過的時間,另外也支援時區、計時器,以及其他相關功能,這些會在另一個概念中介紹。
在這道練習中,你會為一間在 2012 年 9 月 15 日開幕的美容沙龍製作預約排程系統。
這五個任務都與預約日期有關。
實作Schedule函式,將預約日期的文字表示解析成對應的time.Time格式:
Schedule("7/25/2019 13:45:00")
// => 2019-07-25 13:45:00 +0000 UTC
實作HasPassed函式,它會接收一個預約日期,並檢查該預約是否已成為過去:
HasPassed("July 25, 2019 13:45:00")
// => true
實作IsAfternoonAppointment函式,它會接收一個預約日期,並檢查該預約是否在下午(>= 12:00 且 < 18:00):
IsAfternoonAppointment("Thursday, July 25, 2019 13:45:00")
// => true
實作Description函式,它會接收一個預約日期,並回傳該日期與時間的描述:
Description("7/25/2019 13:45:00")
// => "You have an appointment on Thursday, July 25, 2019, at 13:45."
實作AnniversaryDate函式,回傳沙龍開幕日在當前年度的週年紀念日,時間以 UTC 為準。
假設目前年份是 2020 年:
AnniversaryDate()
// => 2020-09-15 00:00:00 +0000 UTC
**注意:**回傳值是 time.Time,一天當中的時間不重要。