Golang中字符串解析为日期不正确的问题如何解决

Golang中字符串解析为日期不正确的问题如何解决 我有这段代码:

package main

import (
	"fmt"
	"time"
)

const (
	layoutISO = "2006-01-02"
	layoutUS  = "January 2, 2006"
	custom    = "%mm/%dd%yy"
)

func main() {
	date := "12/31/19" // "1999-12-31"
	t, _ := time.Parse(custom, date)
	fmt.Println(t)                  // 1999-12-31 00:00:00 +0000 UTC
	fmt.Println(t.Format(layoutUS)) // December 31, 1999
}

但它返回了错误的结果,它返回:

0001-01-01 00:00:00 +0000 UTC
January 1, 0001

我的错误在哪里?


更多关于Golang中字符串解析为日期不正确的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

Go 不使用像 %Y、%d 等格式化参数。它使用一个“神奇”的日期:2006-01-02 15:04:05-0700。

要解析 12/31/19(你是指 12/31/99 吗?),请使用 time.Parse("01/02/06", "12/31/19")

func main() {
    fmt.Println("hello world")
}

更多关于Golang中字符串解析为日期不正确的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


2006-01-02 15:04:05-0700

太好了,非常感谢。

我明白了我的错误,我原本以为要使用的格式是用于重写日期的格式,但实际上它应该是给定日期/字符串本身的格式。 在我的例子中,输入日期格式是 12/31/19,也就是 m/d/y,所以用 1 表示月,2 表示日,2006 或 1061 表示年,那么它就应该写成 1/2/06。如果我的日期是 12/31/2019,那么它就应该写成 1/2/2006。下面这段代码是有效的:

package main

import (
	"fmt"
	"time"
)

const (
	layoutISO = "2006-01-02"
	layoutUS  = "January 2, 2006"
	custom    = "1/2/06"
)

func main() {
	date := "12/31/19"
	t, err := time.Parse(custom, date) // 输入字符串的格式是:custom,不能使用其他格式。
	fmt.Println(t, err)
	fmt.Println(t.Format(layoutUS)) // 打印日期的格式是:layoutUS,可以使用所有其他格式。
}

你的问题在于使用了错误的布局字符串。Go语言的时间解析使用特定的参考时间:Mon Jan 2 15:04:05 MST 2006

对于你的日期格式 "12/31/19"(月/日/年),正确的布局应该是 "01/02/06"

以下是修正后的代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	date := "12/31/19"
	// 使用正确的布局:01表示月,02表示日,06表示两位数的年份
	t, err := time.Parse("01/02/06", date)
	if err != nil {
		fmt.Println("解析错误:", err)
		return
	}
	
	fmt.Println(t) // 2019-12-31 00:00:00 +0000 UTC
	fmt.Println(t.Format("January 2, 2006")) // December 31, 2019
}

如果你想要处理四位数年份的格式 "1999-12-31",布局应该是 "2006-01-02"

package main

import (
	"fmt"
	"time"
)

func main() {
	// 处理四位数年份
	date1 := "1999-12-31"
	t1, _ := time.Parse("2006-01-02", date1)
	fmt.Println(t1) // 1999-12-31 00:00:00 +0000 UTC
	
	// 处理两位数年份
	date2 := "12/31/19"
	t2, _ := time.Parse("01/02/06", date2)
	fmt.Println(t2) // 2019-12-31 00:00:00 +0000 UTC
}

记住Go时间布局的对应关系:

  • 2006:年份
  • 01:月份
  • 02:日期
  • 15:小时(24小时制)
  • 04:分钟
  • 05:秒
  • MST:时区

对于两位数年份 06,Go会将其解析为:

  • 00-68 → 2000-2068
  • 69-99 → 1969-1999
回到顶部