go - 如何在 Go 中将日期转换为带毫秒的 RFC3339 扩展日期字符串?

标签 go

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

也曾在 Go 论坛上提出过这个问题,因为之前收到过有用和建设性的反馈。

我能找到的最近的地方是:

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

例如,这将给出格式为的日期字符串:

1970-02-13T10:31:13Z

除了使用 time.RFC3339 生成字符串然后使用正则表达式解析结果并在 Z 之前标记 .000 之外,我如何获得格式为 1970-02-13T10:31:13.000Z 的日期性格!?

看起来 time.RFC3339 只包含秒,而 time.RFC3339Nano 包含纳秒。但是,time.RFC333Milli 没有任何内容,即毫秒。 RFC3339Milli = "2006-01-02T15:04:05.000Z07:00"

erm..... 在使用 go 编程语言执行这样的任务时,我是否必须定义自己的格式?

根据从 go stack overflow 社区收到的关于这个问题的 2 个关闭链接反馈帖子,起初我以为我在做一个基本的错字之类的。

但是,在这种情况下,在 go 中开发时似乎确实需要自定义格式!另一位开发人员在遇到类似问题时在 golang 存储库中提出了一个问题。该问题可以在官方 golang 存储库中找到,here .

根据问题反馈(阅读问题下方的关闭链接),我在 go playground 添​​加了可重现的示例,here并包含以下代码:

package main

import (
    "fmt"
    "time"
)

func main() {

    createdOn, err := time.Parse("2006-01-02 15:04:05", "2016-07-23 12:43:01")

    if err != nil {
        fmt.Printf("Error parsing date := %v", err)
    }

    sec := createdOn.Format(time.RFC3339)
    nano := createdOn.Format(time.RFC3339Nano)
    milli := createdOn.Format("2006-01-02T15:04:05.000Z07:00")

    fmt.Println("Original date/time := ", "2016-07-23 12:43:01\n\n")
    fmt.Println("Date format using time.RFC3339 := ", sec)
    fmt.Println("\nDate format using time.RFC3339Nano := ", nano)
    fmt.Println("\nDate format using custom format 2006-01-02T15:04:05.000Z07:00 := ", milli)

    fmt.Println("\n\nMilliseconds requires custom format when developing with go!")
}

最佳答案

根据从 go stack overflow 社区收到的关于这个问题的 2 个关闭链接反馈帖子,起初我以为我在做一个基本的错字之类的。

但是,在这种情况下,在 go 中开发时似乎确实需要自定义格式!另一位开发人员在遇到类似问题时在 golang 存储库中提出了一个问题。该问题可以在官方 golang 存储库中找到,here .

根据问题反馈(阅读问题下方的关闭链接),我在 go playground 添​​加了可重现的示例,here并包含以下代码:

解决方案:将 2006-01-02 15:04:05 格式设置为 2016-07-23T12:43:01.000Z

package main

import (
    "fmt"
    "time"
)

func main() {

    createdOn, err := time.Parse("2006-01-02 15:04:05", "2016-07-23 12:43:01")
    
    if err != nil {
        fmt.Printf("Error parsing date := %v", err)
    }

    sec := createdOn.Format(time.RFC3339)
    nano := createdOn.Format(time.RFC3339Nano)
    milli := createdOn.Format("2006-01-02T15:04:05.000Z07:00")

    fmt.Println("Original date/time := ", "2016-07-23 12:43:01\n\n")
    fmt.Println("Date format using time.RFC3339 := ", sec)
    fmt.Println("\nDate format using time.RFC3339Nano := ", nano)
    fmt.Println("\nDate format using custom format 2006-01-02T15:04:05.000Z07:00 := ", milli)

    fmt.Println("\n\nMilliseconds requires custom format when developing with go!")
}

关于go - 如何在 Go 中将日期转换为带毫秒的 RFC3339 扩展日期字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65907011/

相关文章:

types - 范围内的类型重新声明顺序是否应受外部范围的影响?

go - 如何强制 Goland 每次都运行测试?

go - 单值上下文中的多个值

go - 如何理解函数中定义的指针

http - google.com 的 golang 反向代理

mongodb - 创建 session : no reachable servers - mgo

go - PromQL 查询来绘制传入请求的速率

google-app-engine - 从 Golang AppEngine 快速轻松地发布到 Slack Webhook

go - 为什么我的解决方案不适合 tour of go slices 练习?

使用 Golang 的 HTTP 基本身份验证