Golang中如何将日期时间字符串转换为RFC3339格式

Golang中如何将日期时间字符串转换为RFC3339格式 你好,

我是Go语言的新手,想请教一下这个问题。

如何将格式为“2005-06-13 04:40:51”的日期字符串转换为RFC3339格式的UTC日期字符串,例如“2005-06-13T04:40:51.000Z”?

尝试了以下代码:

    createdOn, err := time.Parse("2006-01-02 03:04:05", p.CreatedOn)
    fmt.Println(err.Error())
	
    result := createdOn.Format(time.RFC3339)

但出现了错误:

CreatedOn:  1986-12-03 22:01:35

parsing time "1986-12-03 22:01:35": hour out of range

根据下面的一个建议,我将小时改为了24小时制格式:

createdOn, _ := time.Parse("2006-01-02 15:04:05", p.CreatedOn)
self.CreatedOn = createdOn.Format(time.RFC3339)

例如,这将生成格式如下的日期字符串:

1970-02-13T10:31:13Z

如何让它变成 1970-02-13T10:31:13.000Z 这种格式呢?


更多关于Golang中如何将日期时间字符串转换为RFC3339格式的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

非常感谢,我会进一步调查。

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


将小时写作15而不是03。

看起来有 time.RFC3339 格式只包含秒,以及 time.RFC3339Nano 格式包含纳秒,但我没有看到介于两者之间的格式。你可能需要定义自己的格式:

RFC3339Milli = "2006-01-02T15:04:05.000Z07:00"

非常感谢!

是的,那样就解决问题了!

createdOn, _ := time.Parse("2006-01-02 15:04:05", p.CreatedOn)
self.CreatedOn = createdOn.Format(time.RFC3339)

例如,这将得到一个格式如下的日期字符串:

1970-02-13T10:31:13Z

如何让它变成 1970-02-13T10:31:13.000Z 这种格式呢?

要生成带有毫秒部分的RFC3339格式(如1970-02-13T10:31:13.000Z),可以使用自定义格式字符串。time.RFC3339常量对应的是2006-01-02T15:04:05Z07:00格式,不会包含毫秒。

以下是解决方案:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 原始日期字符串
    dateStr := "1970-02-13 10:31:13"
    
    // 解析为time.Time
    t, err := time.Parse("2006-01-02 15:04:05", dateStr)
    if err != nil {
        panic(err)
    }
    
    // 转换为UTC时区
    t = t.UTC()
    
    // 使用自定义格式包含毫秒部分
    rfc3339WithMillis := t.Format("2006-01-02T15:04:05.000Z")
    
    fmt.Println("原始字符串:", dateStr)
    fmt.Println("RFC3339带毫秒:", rfc3339WithMillis)
    // 输出: 1970-02-13T10:31:13.000Z
}

如果需要在解析时直接指定时区为UTC,可以这样写:

package main

import (
    "fmt"
    "time"
)

func main() {
    dateStr := "1986-12-03 22:01:35"
    
    // 指定时区为UTC进行解析
    loc, _ := time.LoadLocation("UTC")
    t, err := time.ParseInLocation("2006-01-02 15:04:05", dateStr, loc)
    if err != nil {
        panic(err)
    }
    
    rfc3339WithMillis := t.Format("2006-01-02T15:04:05.000Z")
    fmt.Println("结果:", rfc3339WithMillis)
    // 输出: 1986-12-03T22:01:35.000Z
}

对于你的具体代码,可以这样修改:

createdOn, err := time.Parse("2006-01-02 15:04:05", p.CreatedOn)
if err != nil {
    // 处理错误
    fmt.Println("解析错误:", err)
    return
}

// 转换为UTC并格式化为带毫秒的RFC3339
self.CreatedOn = createdOn.UTC().Format("2006-01-02T15:04:05.000Z")

格式字符串中的.000表示三位毫秒数。如果需要其他精度的毫秒数,可以调整:

  • .000 - 三位毫秒(如.123)
  • .000000 - 六位微秒(如.123456)
  • .000000000 - 九位纳秒(如.123456789)
回到顶部