Golang结构体中如何定义日期类型

Golang结构体中如何定义日期类型 大家好,我尝试在结构体中定义日期类型但一直无法实现。我已经做了研究,但确实找不到关于日期的相关资料。我不想在这上面花费太多时间。

当我运行以下代码时,会同时显示日期和时间,但我不需要时间部分,因为我的结构体只需要接收日期。请问有没有更好的方法?

package main

import( "fmt"
"time")

// 这个`person`结构体类型包含`name`、`age`和`dat`字段
type person struct {
name string
age  int
DOB  time.Time
}

func main() {
s1, _:= time.Parse(time.RFC3339, "2018-12-12T11:45:26.371Z")
s := person{name: "Sean", age: 50, DOB:s1}
fmt.Println(s)
}

更多关于Golang结构体中如何定义日期类型的实战教程也可以访问 https://www.itying.com/category-94-b0.html

16 回复

请问如何忽略日期中的小数部分?

更多关于Golang结构体中如何定义日期类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请解析该输入日期。具体是如何获取的?是什么格式?能否展示一些输入数据的示例?

您说得对,但您给出的示例存在多余零的问题。我只想要数据而不需要扩展的零。请问有什么方法可以只获取日期吗?

确实,我不太理解为什么它要特别寻找日期2006年1月2日。当我将年份改为2018时,它就会报错。

那么你需要实现自己的 Date 类型。但说实话,你确实不想这么做。

通常的做法是直接使用 DateTime 类型并忽略一天中的时间部分。

我正在从其他程序(接口)接收日期参数,想要将其传递到我的结构体中,然后使用该结构体进行其他操作,比如数据库更新等。请给出建议

time.Time 类型上有 Date() 方法。

https://golang.org/pkg/time/#Time.Date

您是需要用于打印输出还是其他用途?如果是的话,可以直接在结构体上实现 Stringer 接口。

https://golang.org/pkg/fmt/#Stringer

这取决于你实际想要什么。如果只是打印,使用正确的格式字符串。如果只是解析,同样处理。如果是比较,那么先将其标准化到特定的小时/分钟/秒,然后使用常规的比较方法。

我在使用 Hugo(一个用 Go 编写的工具)时也遇到了同样的情况。出于某种原因,你必须使用 2006 01 02 这样的格式,否则年份会显示成奇怪的数字。不过使用 .Format 方法应该能正常工作。

func main() {
    fmt.Println("hello world")
}

time.Parse() 返回 (time.Time, error),因此您要么在结构体中使用该返回值,要么仅使用 time.Parse() 进行验证,存储纯字符串表示形式,并在必要时才重新解析。可能存在我们未知的考虑因素,这些因素可能会导致选择其中一个版本更为合适。

func main() {
    fmt.Println("hello world")
}

执行以下代码行后:

s1, _ := time.Parse(format, "2018-12-12")

我想将这个s1移动到另一个结构体中,例如:

type person struct {
    name string
    age int
    DOB time.Time
}

我的问题是:DOB的类型应该是time.Time吗?还是其他类型?请问该如何将其移动到person结构体中,以及DOB应该是什么类型。

如果你想从 time.Time 获取字符串,最佳方式是使用 Format(string) string 方法。

为满足你的需求,你可以执行 s.DOB.Format("2006-01-02") 来获取所需格式的字符串。

如果你想在打印结构体时正确格式化日期,你需要在结构体上实现 String() string 方法,该方法随后会调用时间的 Format 方法。

示例:

func (p person) String() string {
    return fmt.Sprintf("{%s %d %s}", p.name, p.age, p.DOB.Format("2006-01-02"))
}

这是我遇到的情况。当我传递日期时得到的是空白日期,我得到的是全零值。

package main

import( "fmt"
"time")

// 这个person结构体类型包含name、age和dat字段
type person struct {
name string
age int
DOB time.Time
}

func main() {
s1, _:= time.Parse(time.RFC3339, "2018-12-12")
s := person{name: "Sean", age: 50, DOB:s1}
fmt.Println(s)
}

输出:- {Sean 50 0001-01-01 00:00:00 +0000 UTC}

Dattatray_Jadhav:

s1, _:= time.Parse(time.RFC3339, “2018-12-12”)

从文档中可以看出,time.RFC3339 要求完整的日期时间。

对我来说,使用 "2006-01-02" 作为第一个参数似乎就足够了:

Go Playground - Go 编程语言

Go Playground - Go 编程语言

人们常常对Go语言处理日期和时间的独特方式感到困惑。Go的time包并不遵循常见的"dd/mm/yyyy hh:mm:ss"(根据语言使用适当的大小写)格式化字符串。相反,它定义了一个参考日期Mon Jan 2 15:04:05 MST 20062016-01-02 15:04:05(即yyyy-mm-dd hh:mm:ss格式),通过这个参考日期来推导出给定布局的格式。例如,调用someDate.Format("02/01/2016 15:04:05")会将someDate格式化为其他语言中"dd/mm/yyyy hh:mm:ss"的效果。

类似地,通过将字符串的布局格式和实际的时间戳字符串值传递给Parse函数来解析日期。因此,调用time.Parse("02/01/2016", "18/12/2018")将返回时间戳2018-12-18 00:00:00 +0000 UTC(如果以yyyy-mm-dd hh:mm:ss格式打印)。

您可以在官方文档中查看所有内容,这里还有更多示例。

在Go语言中,标准库time.Time类型总是包含日期和时间部分。如果你只需要日期部分,有几种常见的方法来处理:

方法1:使用time.Time但只关注日期部分

package main

import (
    "fmt"
    "time"
)

type person struct {
    name string
    age  int
    DOB  time.Time
}

func (p person) String() string {
    return fmt.Sprintf("{name: %s, age: %d, DOB: %s}", 
        p.name, p.age, p.DOB.Format("2006-01-02"))
}

func main() {
    s1, _ := time.Parse(time.RFC3339, "2018-12-12T11:45:26.371Z")
    s := person{name: "Sean", age: 50, DOB: s1}
    fmt.Println(s)
}

方法2:自定义日期类型

package main

import (
    "fmt"
    "time"
)

type Date struct {
    Year  int
    Month time.Month
    Day   int
}

func (d Date) String() string {
    return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day)
}

func NewDate(year int, month time.Month, day int) Date {
    return Date{Year: year, Month: month, Day: day}
}

func DateFromTime(t time.Time) Date {
    return Date{
        Year:  t.Year(),
        Month: t.Month(),
        Day:   t.Day(),
    }
}

type person struct {
    name string
    age  int
    DOB  Date
}

func main() {
    // 方法1:直接创建日期
    s1 := person{
        name: "Sean", 
        age: 50, 
        DOB: NewDate(2018, time.December, 12),
    }
    
    // 方法2:从time.Time转换
    t, _ := time.Parse(time.RFC3339, "2018-12-12T11:45:26.371Z")
    s2 := person{
        name: "Alice", 
        age: 30, 
        DOB: DateFromTime(t),
    }
    
    fmt.Println(s1) // {Sean 50 2018-12-12}
    fmt.Println(s2) // {Alice 30 2018-12-12}
}

方法3:使用字符串存储日期

package main

import (
    "fmt"
    "time"
)

type person struct {
    name string
    age  int
    DOB  string // 格式: "YYYY-MM-DD"
}

func main() {
    t, _ := time.Parse(time.RFC3339, "2018-12-12T11:45:26.371Z")
    dateStr := t.Format("2006-01-02")
    
    s := person{name: "Sean", age: 50, DOB: dateStr}
    fmt.Println(s) // {Sean 50 2018-12-12}
}

方法4:使用第三方日期库

如果你需要更完整的日期功能,可以考虑使用第三方库如github.com/rickb777/date

import "github.com/rickb777/date"

type person struct {
    name string
    age  int
    DOB  date.Date
}

推荐使用方法2(自定义日期类型),因为它提供了类型安全性和清晰的语义,同时避免了不必要的时间部分。

回到顶部