在Go语言中,time.Parse函数出现奇怪的行为

5
当您执行以下代码片段时,主要是从Go的时间包文档和其解析函数示例派生而来:
package main

import (
   "time"
   "fmt"
)

var shortForm = "2006-Jan-02"
t, _ := time.Parse(shortForm, "2013-Feb-03")
fmt.Println(t)

然后,您就可以在控制台中获取正确的结果2013-02-03 00:00:00 +0000 UTC。但是,当您稍微改变shortForm的值,例如2007-Jan-022006-Feb-022006-Jan-01时,它会输出错误的结果,而且输出看起来甚至不规律,例如0001-01-01 00:00:00 +0000 UTC2013-03-01 00:00:00 +0000 UTC2013-01-03 00:00:00 +0000 UTC。那么为什么函数会表现得这么奇怪呢?我该如何处理它?每次使用该函数时,我是否应该始终将layout变量定义为2006-Jan-02?谢谢。
1个回答

7
time.Parsetime.Format函数使用布局参数中的数字来确定所指代的日期组件:
  • 1:月份(也可用单词表示为Jan / January
  • 2:日
  • 3:小时(也可用24小时制表示为15
  • 4:分钟
  • 5:秒
  • 6:年份(也可用4位数表示为2006
  • 7:时区(也可用时区代码表示为MST
因此,当您将布局字符串从2006-Jan-02更改为2006-Jan-01时,您实际上是在说月份在时间字符串中出现了两次,导致了意外的结果。

看起来这是一种奇怪的格式化方式,我发现很难理解内部发生了什么,直到你在你出色的解释中帮助了我...所以我认为这超出了Go的范围,更与计算机或语言如何处理时间有关,对吧?非常感谢你的回答。 - Blaszard
其他编程语言使用像“MM-dd-yyyy”这样的字符串,然后你必须记住“MM”是月份,而“mm”是分钟(或者反过来?)并且MM表示两位数的月份(可能带有前导零),而MM表示缩写(“Jan”或其他)。我认为Go的方法更简单一些。 - Tyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接