我正在決議用戶發送的時間戳。時間戳是某個位置的本地時間戳,但源字串未指定它。服務器端我正在查找位置的時區,需要將時間移到該時區,而不更改其顯示值。
我知道我可以這樣做,以便在不同的位置為我提供相同的時間:
package main
import (
"fmt"
"time"
)
func main() {
myTime := time.Now()
fmt.Println(myTime.Format(time.RFC3339))
loc, err := time.LoadLocation("America/New_York")
if err != nil {
panic(err)
}
fmt.Println(myTime.In(loc).Format(time.RFC3339))
}
這只是列印:
2009-11-10T23:00:00Z
2009-11-10T18:00:00-05:00
這不是我想要的。
我試圖找到一種將時區設定為 eg 的方法America/New_York,所以我應該得到 eg 2009-11-10T23:00:00-05:00,這是原始本地時間,但應用了紐約偏移量。
我怎樣才能在 Go 中做到這一點?
uj5u.com熱心網友回復:
混淆來自這樣一個事實,即直覺上想到的 APIIn只是將相同的時間點解釋為位于不同的時區。所以當你列印它時,顯示不是你想要的。
要將時區設定為時間戳同時保持相同的顯示值,您可以簡單地構造具有time.Date與原始時間戳和新位置相同的值的新時間戳:
t := time.Date(myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), myTime.Nanosecond(), loc)
// 2009-11-10T23:00:00-05:00 in the playground
另一種選擇是將時間實體設定為新時區,然后使用Zone()獲取偏移量,然后從本地化時間中減去其值(以秒為單位)。
package main
import (
"fmt"
"time"
)
func main() {
myTime := time.Now()
fmt.Println(myTime.Format(time.RFC3339))
loc, err := time.LoadLocation("America/New_York")
if err != nil {
panic(err)
}
locTime := myTime.In(loc)
_, zoneOffset := locTime.Zone()
inZoneTime := locTime.Add(-time.Duration(zoneOffset) * time.Second)
// handle DST transitions
if inZoneTime.IsDST() {
inZoneTime = inZoneTime.Add(1*time.Hour)
}
fmt.Println(inZoneTime.Format(time.RFC3339))
// 2009-11-10T23:00:00-05:00
}
今天要在本地計算機中測驗 DST 轉換(假設您在非 DST 國家/地區,就像我一樣),您可以將位置更改為 DST 處于活動狀態的位置,例如Australia/Canberra.
輸入time.Now()不帶夏令時進入Australia/Canberra,上述程式列印以下內容:
2021-11-12T13:27:33 01:00
is DST: true
2021-11-12T13:27:33 11:00
游樂場:https : //play.golang.org/p/5qy2tOcIMwn
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358310.html
