我有一个包含timestamp TIMESTAMP
,data 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?
答案 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