从Go语言中的随机日期获取时间(天)

edqdpe6u  于 2023-01-28  发布在  Go
关注(0)|答案(3)|浏览(165)

我有一个API端点,它将收集一些结构化数据,其中一个字段是时间戳,格式如下:
"2022-08-30 09:05:27.567995"
我的要求是计算自这个时间戳样式以来的天数。
我有这个代码,这是工作,但我正在寻找改进goplayground

package main

import (
    "fmt"
    "math"
    "time"
)

func main() {

    s1 := "2023-01-20"
    date1, _ := time.Parse("2006-01-02", s1)
    t1 := time.Now().Round(0)
    days := int(math.Ceil(t1.Sub(date1).Hours() / 24))
    fmt.Println("days: ", days)
}

我有两个问题:
1.我无法在time.Time中找到任何可以识别该时间格式的内容,所以我做了字符串解析,以获得日期(解析第一个空格),并将其作为变量插入到s1中。这很好(这里没有列出代码),但我更希望time.Time能够从该格式("2022-08-30 09:05:27.567995")中只解析日期。
1.有没有更好的方法来计算自时间戳以来的天数,也许不需要导入数学包?我对这看起来有多困难感到有些惊讶,因为我认为time。since()将能够做到这一点,但我没有成功,所以我想出了这段代码。

icnyk63a

icnyk63a1#

我用time.Since()尝试了下面的代码,结果如我所料:

package main

import (
    "fmt"
    "time"
)

func main() {

    // this is the input from JSON
    // used this as an example for checking calculation in Go playground
    // which starts time at 2009-11-10 23:00:00 UTC
    timeStr := "2009-11-11 23:00:00.000000"

    parseLayout := "2006-01-02 15:04:05.000000"

    t, err := time.Parse(parseLayout, timeStr)
    if err != nil {
        fmt.Printf("Error parsing datetime value %v: %w", timeStr, err)
    }

    durationDays := int(time.Since(t).Abs().Hours() / 24)
    fmt.Println(durationDays)
}

当你使用Matteo发布的格式字符串时,你的时间字符串应该被正确解析。https://pkg.go.dev/time#pkg-constants有关格式字符串的详细信息,请参阅www.example.com。

i7uaboj4

i7uaboj42#

JSON没有date\datetime数据类型,您可以从string进行解析。

json := "2022-08-30 09:05:27.567995"
t := time.Parse("2006-01-02 15:04:05.999999", json)

您不需要数学软件包:

package main

import (
    "fmt"
    "time"
)

func main() {

    s1 := "2023-01-20" // or "2022-08-30 09:05:27.567995"
    date1, _ := time.Parse("2006-01-02", s1)
    t1 := time.Now()

    // Unfortunately there isn't a direct truncation to Date only
    y, m, d := t1.Date()
    t1 = time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
    // now is truncated to Date

    days := t1.Sub(date1).Hours() / 24
    fmt.Println("days: ", days)
}

编辑:扩展到JSON的情况下,你需要截断很多数据。你可以这样做:

package main

import (
    "fmt"
    "time"
)

type myTime time.Time

func main() {

    s1 := "2023-01-20 09:05:27.567995" // or "2022-08-30 09:05:27.567995"
    date1, _ := time.Parse("2006-01-02 15:04:05.999999", s1)
    date1 = myTime(date1).DateOnly()
    t1 := myTime(time.Now()).DateOnly()

    days := t1.Sub(date1).Hours() / 24
    fmt.Println("days: ", days)

}

func (t myTime) DateOnly() time.Time {
    y, m, d := time.Time(t).Date()
    return time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
}
6rvt4ljy

6rvt4ljy3#

对于问题的第一点,可以使用2006-01-02 15:04:05.999999模式进行解析,如下所示:

package main

import (
    "fmt"
    "time"
)

func main() {
    x := "2022-08-30 09:05:27.567995"

    fmt.Println(time.Parse("2006-01-02 15:04:05.999999", x))
}

参见https://go.dev/play/p/v4TSXJyNOxg

相关问题