使用 google.protobuf.Timestamp 在 Go 中解析带有时区偏移的日期时间戳

2024-05-09

我正在创建一个将使用 GRPC 和 protobuf 的 Go 应用程序。我的 RPC 服务应获取包含类型的消息google.protobuf.Timestamp,解析它并最终将其保存在数据库中或对其执行更多操作。

我对什么被认为是该类型的有效输入感到困惑google.protobuf.Timestamp。我希望对带有时区偏移的日期时间戳使用以下格式。

2019-02-15T13:00:00+01:00

这是我正在使用的原型文件。

syntax = "proto3"
package example;
import "google/protobuf/timestamp.proto"

service Tester {
 rpc ParseDateTimeStamp(TSRequest) returns (TSReply) {}
}

message TSRequest {
  google.protobuf.Timestamp dts = 1;
}

message TSReply {
 string message = 1;
}

问题是当我向 GRPC 服务器发送包含日期时间戳的消息时。我希望这种类型*tsbp.Timestamp为了2019-02-15T13:00:00+01:00指定的日期时间戳是有效的,并给我从纪元开始的适当秒数。 (调用后GetSeconds()来自时间戳.go)

调用ptypes.TimestampString(ts *tspb.Timestamp)回报1970-01-01T00:00:00Z对于上面的示例输入。

是否google.protobuf.Timestamp接受带有 +- 偏移量的日期时间戳?

或者我是否必须输入 String 类型,然后解析为time.Time with time.Format而不是在 protobuf 中使用时间戳变量类型?如果是这样,您能提供一个例子吗?


gRPC 消息类型google.protobuf.时间戳 https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto,内部只有两个int64's

message Timestamp {
  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive.
  int32 nanos = 2;
}

所以当采用这种格式类型时,没有什么可以parse.

通常需要:

  • 像你这样的字符串格式2019-02-15T13:00:00+01:00并转换为time.Time using time.Parse
  • 然后转换time.Time to a *tspb.Timestamp using ptypes.TimestampProto() https://godoc.org/github.com/golang/protobuf/ptypes#TimestampProto

仅供参考,在您引用的输出中,您会看到zero时间戳(即秒和纳秒都为零) - 因此"1970-01-01T00:00:00Z" output.


实现上面的流程:

ts, err := time.Parse(time.RFC3339, "2019-02-15T13:00:00+01:00")

pbts, err := ptypes.TimestampProto(ts) // ptypes.Timestamp:"seconds:1550232000 "

fmt.Println(ptypes.TimestampString(pbts)) // "2019-02-15T12:00:00Z"

操场 https://play.golang.org/p/UABbRDSYb_y

Note: the ptype.Timestamp被剥夺了任何时区 -Z so UTC时间。因此,如果您需要保留时区time.Time,除了您的 gRPC 消息之外,还需要在您的 gRPC 消息中发送偏移量google.protobuf.Timestamp信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 google.protobuf.Timestamp 在 Go 中解析带有时区偏移的日期时间戳 的相关文章

随机推荐