Я рассматриваю возможность использования протокольных буферов для обмена данными между Linux и системой на базе Windows.
Каков рекомендуемый формат для отправки значений даты/времени (отметки времени)? При сериализации поле должно быть небольшим.
Я рассматриваю возможность использования протокольных буферов для обмена данными между Linux и системой на базе Windows.
Каков рекомендуемый формат для отправки значений даты/времени (отметки времени)? При сериализации поле должно быть небольшим.
Хотя вы не говорите, какие языки вы используете или какую точность вам нужно, я бы предложил использовать Unix time, закодированный в int64
. Это довольно легко обрабатывать на большинстве языков и платформ (см. здесь для примера Windows), а Protobufs будет использовать varint-encoding, сохраняя размер маленьким, не слишком ограничивая отображаемый диапазон.
Существует тип сообщения Timestamp
с protobuf 3.0, который, как его создать в модели:
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message MyMessage {
google.protobuf.Timestamp my_field = 1;
}
timestamp.proto
файл содержит примеры использования Timestamp, в том числе связанные с 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));
В последней версии protobuf (3.0) - для С# доступна отметка времени WellKnownType. Проверьте this