我正在尝试从我的SQL数据库中获取time.Time对象,并将检索到的值转换为格式化的字符串,如下所示:
TIME_FORMAT := "%Y-%m-%dT%H:%M:%S"
这是我在Python中用来做同样事情的格式,但我知道它不正确。我已经从数据库中获取了值,现在只需要格式化它。请注意我已将ccc.Ia_date定义为interface {}类型,因为DB中的此值可能为null。这是我的代码片段:
fmt.Println(reflect.TypeOf(ccc.Ia_date)) //gives me time.Time
t := ccc.Ia_date //which prints as: 2016-11-16 21:06:39 +0000 +0000
fmt.Println(t.Format())
我收到以下错误:
t.Format undefined(type interface {}是没有方法的接口)
我错过了一个导入?或者这是不可能使用接口类型?如果是这样,我有什么替代方法来接受数据库中的空值? (我已经看到了Golang: convert time.Time to string的相关答案 - 我试过这个解决方案,但我没有抓紧时间。现在,这是我看到的唯一区别)
答案 0 :(得分:1)
如果您的interface{}
值的值为time.time
,则可以使用type assertion获取已包裹的time.Time
:
if t, ok := ccc.Ia_date.(time.Time); ok {
// here t is of type time.Time, and so you can call its Format() method:
fmt.Println(t.Format(layout))
} else {
// ccc.Ia_date is not of type time.Time, or it is nil
}
请注意,如果要允许*time.Time
,只需使用指针nil
会更容易,因此您不需要使用类型断言。有关详细信息,请参阅此答案:Golang JSON omitempty With time.Time Field
如果ccc.Ia_date
的类型为*time.Time
:
if ccc.Ia_date != nil {
fmt.Println(ccc.Ia_date.Format(layout))
}
所需格式的布局字符串为:
layout := "2006-01-02T15:04:05"
答案 1 :(得分:0)
您有多个问题。首先,如果ccc.Ia_date
是interface{}
,则必须先将其声明为time.Time
,然后才能使用time.Time
的任何方法。您可以使用双参数类型断言形式来避免恐慌:
t, ok := ccc.Ia_date.(time.Time)
if !ok {
// wrong type or nil value, handle it
}
t.Format(timeFormat)
您还需要定义格式字符串。格式字符串定义为标准化日期和时间,即Mon Jan 2 15:04:05 -0700 MST 2006
。因此,对于您的格式,您需要:
time_format := "2006-01-02T15:04:05"
t.Format(timeFormat)
然而,这缺乏时区。它也与RFC3339("2006-01-02T15:04:05Z07:00"
)几乎相同,您可以使用它来代替:
t.Format(time.RFC3339)