Golang中如何将字符串日期解析为yyyy-mm-dd格式

Golang中如何将字符串日期解析为yyyy-mm-dd格式 以下是我正在尝试的代码段:

package main
import (
"fmt"
"time"
)

func main(){
const format = "2005-03-04"
pdate,_ := time.Parse(format, "2015-05-06")
fmt.Println(pdate)

const shortForm = "2006-01-02"
t, _ := time.Parse(shortForm, "2013-02-03")
fmt.Println(t)
}

对应的输出如下:

0001-01-01 00:00:00 +0000 UTC 2013-02-03 00:00:00 +0000 UTC

尽管我使用了相同的语法,为什么结果会不同呢?


更多关于Golang中如何将字符串日期解析为yyyy-mm-dd格式的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

time.Parse 的文档说明:

Parse 解析一个格式化的字符串并返回它所代表的时间值。布局通过展示参考时间(定义为 Mon Jan 2 15:04:05 -0700 MST 2006)如果作为值将如何被解释来定义格式;它作为输入格式的示例。然后将对输入字符串进行相同的解释。

这意味着你不能使用像 “2005-03-04” 这样的任意日期;它必须是 “魔法” 值 2006-01-02 15:04:05。

更多关于Golang中如何将字符串日期解析为yyyy-mm-dd格式的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的代码中使用了不同的布局字符串,这是导致解析结果不同的原因。在Go语言中,time.Parse 使用的布局字符串必须基于参考时间 Mon Jan 2 15:04:05 MST 2006 来定义。

在你的第一个例子中:

const format = "2005-03-04"
pdate,_ := time.Parse(format, "2015-05-06")

布局字符串 "2005-03-04" 不符合Go的时间布局约定。Go解析器会尝试将 "2015-05-06" 按照这个格式解析,但由于布局字符串无效,导致解析失败,返回了零值时间。

正确的做法是使用基于参考时间的布局字符串。对于 yyyy-mm-dd 格式,应该使用 "2006-01-02"

package main

import (
    "fmt"
    "time"
)

func main() {
    // 正确的布局字符串
    const layout = "2006-01-02"
    
    // 解析字符串日期
    t, err := time.Parse(layout, "2015-05-06")
    if err != nil {
        fmt.Println("解析错误:", err)
        return
    }
    
    fmt.Println("解析结果:", t)
    fmt.Println("格式化输出:", t.Format(layout))
    
    // 另一个例子
    t2, _ := time.Parse(layout, "2023-12-25")
    fmt.Println("另一个日期:", t2.Format(layout))
}

输出结果:

解析结果: 2015-05-06 00:00:00 +0000 UTC
格式化输出: 2015-05-06
另一个日期: 2023-12-25

关键点:

  1. 布局字符串中的数字是固定的:2006 表示年,01 表示月,02 表示日
  2. 这些数字对应参考时间 Mon Jan 2 15:04:05 MST 2006 的各个部分
  3. 布局字符串中的分隔符(如 -)需要与输入字符串中的分隔符完全匹配

如果你需要处理不同格式的日期字符串,可以定义不同的布局:

// 处理斜杠分隔的日期
t1, _ := time.Parse("2006/01/02", "2015/05/06")

// 处理没有分隔符的日期
t2, _ := time.Parse("20060102", "20150506")

// 处理带时间的日期
t3, _ := time.Parse("2006-01-02 15:04:05", "2015-05-06 14:30:00")

在你的第二个例子中使用了正确的布局字符串 "2006-01-02",所以能够成功解析 "2013-02-03"。第一个例子使用了无效的布局 "2005-03-04",导致解析失败。

回到顶部