Тип даты и времени для использования с Protobuf - PullRequest
41 голосов
/ 26 августа 2010

Я рассматриваю возможность использования протокольных буферов для обмена данными между системой Linux и Windows.

Какой рекомендуемый формат для отправки значений даты / времени (метки времени)?Поле должно быть небольшим при сериализации.

Ответы [ 3 ]

66 голосов
/ 21 марта 2017

Начиная с protobuf 3.0, существует тип сообщения Timestamp, который создается в модели:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

message MyMessage {
    google.protobuf.Timestamp my_field = 1;
}
Файл

timestamp.proto содержит примеры использования метки времени, в том числе связанные с программами Linux и Windows.

Пример 1. Вычислить временную метку из POSIX time().

Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);

Пример 2. Вычисление метки времени из POSIX gettimeofday().

struct timeval tv;
gettimeofday(&tv, NULL);

Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);

Пример 3. Вычислить метку времени из Win32 GetSystemTimeAsFileTime().

FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;

// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
Timestamp timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
37 голосов
/ 02 сентября 2010

Хотя вы не говорите, какие языки вы используете или какую точность вам требуется, я бы предложил использовать Unix time , закодированный в int64. Это довольно легко обрабатывать на большинстве языков и платформ (см. здесь для примера Windows), и Protobufs будет использовать varint-encoding , сохраняя размер небольшим, не ограничивая при этом представительный диапазон. много.

5 голосов
/ 22 ноября 2016

В последней версии protobuf (3.0) - для C # доступна отметка времени WellKnownType Проверьте это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...