如何在golang中使用.Format将time.Time对象转换为格式化字符串?

时间:2016-11-21 16:32:16

标签: postgresql go interface formatting

我正在尝试从我的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的相关答案 - 我试过这个解决方案,但我没有抓紧时间。现在,这是我看到的唯一区别)

2 个答案:

答案 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_dateinterface{},则必须先将其声明为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)