Анализ отметок даты и времени со смещением часового пояса в Go с помощью google.protobuf.Timestamp

Я создаю приложение Go, которое будет использовать GRPC и protobuf. Моя служба 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 datetimestamp будет действительным и даст мне соответствующие секунды от эпохи. (После вызова GetSeconds() из timestamp.go)

Вызов ptypes.TimestampString(ts *tspb.Timestamp) возвращает 1970-01-01T00:00:00Z для примера ввода выше.

google.protobuf.Timestamp принимает отметки даты и времени со смещением + -?

Или мне нужно ввести тип String, а затем проанализировать time.Time с помощью time.Format вместо использования типа переменной timestamp в protobuf? Если да, не могли бы вы привести пример этого?


person Sevren    schedule 03.08.2019    source источник
comment
при возврате сообщения TSReply - хотите ли вы, чтобы оно включало исходное смещение часового пояса? Если это так, ваше входное значение ptype.Timestamp не имеет хранилища значения TZ, поэтому любое смещение необходимо будет включить в дополнительное поле.   -  person colm.anseo    schedule 04.08.2019


Ответы (1)


Тип сообщения gRPC google.protobuf.Timestamp внутри - это всего лишь два int64

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;
}

Поэтому в этом типе формата нечего разбирать.

Обычно берется:

  • строковый формат, такой как ваш 2019-02-15T13:00:00+01:00, и преобразуется в time.Time с помощью time.Parse
  • затем преобразуйте time.Time в *tspb.Timestamp с помощью ptypes.TimestampProto ()

К вашему сведению, в цитируемом вами выводе вы видите временную метку zero (т.е. обе секунды и нано равны нулю) - отсюда и результат "1970-01-01T00:00:00Z".


Реализация описанного выше потока:

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"

Детская площадка

Примечание. в ptype.Timestamp отсутствует какой-либо часовой пояс - Z, поэтому UTC время. Поэтому, если вам нужно сохранить часовой пояс time.Time, смещение нужно будет отправить в сообщении gRPC в дополнение к сообщению google.protobuf.Timestamp.

person colm.anseo    schedule 04.08.2019