如何在没有时区的情况下从Postgresql中获取时间戳值?

时间:2018-04-06 11:14:21

标签: postgresql go

我有一个包含timestamp TIMESTAMPdata TEXT列的表格。我有一个失败的测试,因为我无法从没有时区注释的postgresql中获取时间戳值。这是我在Go应用程序中完成的删节版本:

type Datapoint struct {
    Timestamp  string
    Data       sql.NullString
}
var testData = Datapoint{Timestamp:'2018-12-31 00:00:00', Data:'test'}

db.Exec("CREATE TABLE mytable (id SERIAL, timestamp TIMESTAMP, data TEXT);")
db.Exec("INSERT INTO mytable(timestamp, data) VALUES ($1, $2);", testData.Timestamp, testData.Data)
datapoints, err = db.Exec("SELECT timestamp::TIMESTAMP WITHOUT TIME ZONE, data FROM mytable;")

这个问题就是这个查询(在大约20行错误检查和row.Scan之后; golang有点像这样......)给了我:

  预计2018-12-31 00:00:00,收到2018-12-31T00:00:00Z

我没有时区请求(并且查询在psql中成功),为什么我在字符串中获得额外的T和Z?

2 个答案:

答案 0 :(得分:2)

扫描成time.Time而不是字符串,然后您可以根据需要格式化时间。

package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"
)

type Datapoint struct {
    Timestamp time.Time
    Data      sql.NullString
}

func main() {
    var db *sql.DB

    var dp Datapoint    
    err := db.QueryRow("SELECT timestamp, data FROM mytable").Scan(
        &dp.Timestamp, &dp.Data,
    )

    switch {
    case err == sql.ErrNoRows:
        log.Fatal("No rows")
    case err != nil:
        log.Fatal(err)
    default:
        fmt.Println(dp.Timestamp.Format("2006-01-02 15:04:05"))
    }

}

答案 1 :(得分:0)

您收到的是ISO 8601时间表。

T是在表示的时间分量之前的时间指示符。

Z用于表示它是UTC时间,Z表示零偏移。

在某种程度上,你得到的东西没有时区,但它可能会令人困惑,特别是因为你没有在任何时候本地化你的时间。我建议您考虑使用ISO时间,或者您可以将时间转换为这样的字符串

class UserUpdateSerializer(serializers.HyperlinkedModelSerializer):
    avatar = serializers.ImageField(max_length=None, allow_empty_file=True, required=False)

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            'mobile_phone',
            'avatar',
        )

    def update(self, instance, validated_data):
        for field, value in validated_data.items():
            setattr(instance, field, value)
        instance.save()
        log.info("User %s, %s changed his profile" % (instance.username, instance.email))
        return instance