当日期在1900之前时,为什么时间包有不同的行为

  • 本文关键字:时间 1900 日期 go time
  • 更新时间 :
  • 英文 :


我试图使用golang的时间包从SQL服务器中格式化一些带有时区的日期,但发现:

package main
import (
"time"
"fmt"
)
func main() {
loc, _ := time.LoadLocation("Asia/Shanghai")
endTime1 := time.Date(1, 1, 17, 23, 59, 59, 999*int(time.Millisecond), loc)
fmt.Printf("format string 1 : %sn", endTime1.UTC().Format("2006-01-02T15:04:05.000Z"))

endTime2 := time.Date(2021, 1, 17, 23, 59, 59, 999*int(time.Millisecond), loc)
fmt.Printf("format string 2 : %sn", endTime2.UTC().Format("2006-01-02T15:04:05.000Z"))
}
# output
format string 1 : 0001-01-17T15:54:16.999Z
format string 2 : 2021-01-17T15:59:59.999Z

输出的";HH:mm:ss";部分不同。我终于找到了关键时间是1900-12-31,但没有从源代码或互联网上找到任何关于那天的线索。

似乎与上海时区有关。

从这个页面你可以阅读

1901年1月1日-时区变更(LMT→CST(当当地标准时间即将到来时1901年1月1日,星期二,00:00:00时钟向后拨0:05:431900年12月31日,星期一,当地标准时间23:54:17。

此外,我们可以在go文档中找到更多信息

夏令时转换跳过或重复时间。例如,在美国,2011年3月13日凌晨2:15从未发生过,而2011年11月6日凌晨1:15发生过两次。在这种情况下,时区的选择以及时间的选择是不明确的。Date返回在转换中涉及的两个区域中的一个区域中正确的时间,但它不能保证是哪个区域。

最新更新