【问题标题】:Strange behavior in time.Parse function in Go时间中的奇怪行为。Go中的解析函数
【发布时间】:2013-09-26 11:43:25
【问题描述】:

当你执行以下代码sn -p时,主要来源于Go's time package documentation and its Parse function example

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 UTC、@ 987654329@,或2013-01-03 00:00:00 +0000 UTC

那么为什么函数的行为如此奇怪呢?我该如何处理?每次使用该函数时,是否应该始终将布局变量定义为2006-Jan-02

谢谢。

【问题讨论】:

    标签: datetime time go


    【解决方案1】:

    time.Parsetime.Format 函数使用布局参数中的数字来标识引用了哪个日期组件:

    • 1:月份(也可以用文字表示为Jan / January
    • 2: 天
    • 3: 小时(或者15 表示 24 小时制)
    • 4:分钟
    • 5:秒
    • 6: 年份(或者 2006 表示 4 位数年份)
    • 7:时区(或者MST 时区代码)。

    因此,当您将布局字符串从2006-Jan-02 更改为2006-Jan-01 时,您是说月份在时间字符串中表示了两次,导致意外结果。

    【讨论】:

    • 这看起来像是一种奇怪的格式化方式,我发现在您帮助我进行出色的澄清之前,很难了解内部发生的事情......所以我认为这超出了Go 的范围并且与计算机或语言通常如何处理时间更密切相关,对吗?非常感谢您的回答。
    • 其他语言使用像'MM-dd-yyyy'这样的字符串,然后你必须记住'MM'是月份,而'mm'是分钟(或者相反?) MM 表示两位数的月份(可能带有前导零),MM 表示缩写(“Jan”或其他)等。我认为 Go 方法更简单一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多