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
请解析该输入日期。具体是如何获取的?是什么格式?能否展示一些输入数据的示例?
您说得对,但您给出的示例存在多余零的问题。我只想要数据而不需要扩展的零。请问有什么方法可以只获取日期吗?
那么你需要实现自己的 Date 类型。但说实话,你确实不想这么做。
通常的做法是直接使用 DateTime 类型并忽略一天中的时间部分。
我正在从其他程序(接口)接收日期参数,想要将其传递到我的结构体中,然后使用该结构体进行其他操作,比如数据库更新等。请给出建议
time.Time 类型上有 Date() 方法。
https://golang.org/pkg/time/#Time.Date
您是需要用于打印输出还是其他用途?如果是的话,可以直接在结构体上实现 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语言处理日期和时间的独特方式感到困惑。Go的time包并不遵循常见的"dd/mm/yyyy hh:mm:ss"(根据语言使用适当的大小写)格式化字符串。相反,它定义了一个参考日期Mon Jan 2 15:04:05 MST 2006或2016-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(自定义日期类型),因为它提供了类型安全性和清晰的语义,同时避免了不必要的时间部分。



