为了账号安全,请及时绑定邮箱和手机立即绑定

解析时间到字符串并返回

解析时间到字符串并返回

Go
SMILET 2022-05-18 15:49:20
我正在尝试在 Go 中做一些在 Java 等语言中非常简单的事情我想将当前时间解析为字符串,然后将其解析回时间。这是我尝试过的代码,但从这里可以看出它给出了意想不到的结果。我面临两个问题time.Now().String() 给出了错误的日期如果我将时间转换为字符串并将其转换回时间,它会给出一个完全不同的日期。什么是正确(且简单)的方法?       p := fmt.PrintlnstartStr := time.Now().String()   //2009-11-10 23:00:00 +0000 UTC m=+0.000000001p(startStr)startTime, _ := time.Parse(    "2009-11-10 23:00:00 +0000 UTC m=+0.000000001",    startStr)p(startTime)             //0001-01-01 00:00:00 +0000 UTC
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

time.Now().String()仅用于调试(参见 参考资料go doc)。


您应该改用time.Format().


例如:


    p := fmt.Println

    now := time.Now().Format(time.RFC3339)

    p(now)


    parsed, _ := time.Parse(time.RFC3339, now)

    p(parsed.Format(time.RFC3339))

产生:


2009-11-10T23:00:00Z

2009-11-10T23:00:00Z

您的其他担忧time.Now().String() gives a wrong date可能是由于您运行代码的位置。例如,如果您在“The Go Playgounrd”中运行,那么时间将不准确。您应该在自己的计算机上运行它,并假设您的计算机有正确的时间,那么您应该打印正确的时间。


查看完整回答
反对 回复 2022-05-18
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

与其他一些语言不同,Go 并不将 String() 视为事实上的编组方法——相反,它只是为了调试目的而打印出值。如果您使用正确的格式字符串,您可以从该格式解析回时间;但是,正确的格式字符串必须是 的确切时间Mon Jan 2 15:04:05 MST 2006,而不是任何时间;但是 String() 打印出来的格式没有被 Time 包中的常量捕获,所以它可能不值得做。


但是,相反,MarshalText 和 UnmarshalText 方法可能会更好地捕获您尝试做的事情:


startStr, _ := time.Now().MarshalText()

fmt.Println(string(startStr)) // 2009-11-10T23:00:00Z


startTime := new(time.Time)

startTime.UnmarshalText(startStr)


fmt.Println(startTime) // 2009-11-10 23:00:00 +0000 UTC


查看完整回答
反对 回复 2022-05-18
?
慕容708150

TA贡献1831条经验 获得超4个赞

操场上的时间是固定的,总是围棋公告的日期和时间。


https://github.com/golang/go/issues/10663


因此,要正确使用时间,您需要在本地运行它。


关于将时间解析为字符串或返回,您必须传递时间字符串的格式:例如:


package main


import (

    "fmt"

    "time"

)


func main() {

    current := time.Now()

    fmt.Println("Init Time:", current.String())

    timeCustomFormatStr := current.Format("2006-01-02 15:04:05 -0700")

    fmt.Println("Custom format", timeCustomFormatStr)

    parsedTime, err := time.Parse("2006-01-02 15:04:05 -0700",timeCustomFormatStr)

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Println("parsedTime From Custom:", parsedTime)


    timeFormatRFC3339 := current.Format(time.RFC3339)

    fmt.Println("RFC3339 format", timeFormatRFC3339)


    parsedTimeRFC3339, err := time.Parse(time.RFC3339,timeFormatRFC3339)

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Println("parsedTime From Custom:", parsedTimeRFC3339)

}

参考:1 https://golang.org/pkg/time/#Time.Format


查看完整回答
反对 回复 2022-05-18
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号