Date and time type for use with Protobuf

Protocol Buffers

Protocol Buffers Problem Overview


I'm considering to use Protocol Buffers for data exchange between a Linux and a Windows based system.

Whats the recommended format for sending date/time (timestamp) values? The field should be small when serialized.

Protocol Buffers Solutions


Solution 1 - Protocol Buffers

There is Timestamp message type since protobuf 3.0, that's how to create it in model:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

message MyMessage {
    google.protobuf.Timestamp my_field = 1;
}

timestamp.proto file contains examples of Timestamp using, including related to Linux and Windows programs.

> Example 1: Compute Timestamp from POSIX time().

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

> Example 2: Compute Timestamp from POSIX gettimeofday().

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

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

> Example 3: Compute Timestamp from 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));

Solution 2 - Protocol Buffers

Although you aren't saying which languages you are using or what kind of precision you need, I would suggest using Unix time encoded into a int64. It is fairly easy to handle in most languages and platforms (see here for a Windows example), and Protobufs will use a varint-encoding keeping the size small without limiting the representable range too much.

Solution 3 - Protocol Buffers

In the latest protobuf version (3.0) - For C#, Timestamp a WellKnownType is available. Check this

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionasgautView Question on Stackoverflow
Solution 1 - Protocol BuffersEvgeny VeretennikovView Answer on Stackoverflow
Solution 2 - Protocol BuffersJesperEView Answer on Stackoverflow
Solution 3 - Protocol BuffersHari Hara ChandanView Answer on Stackoverflow