Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Date and time type for use with Protobuf

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.

like image 420
asgaut Avatar asked Aug 26 '10 11:08

asgaut


People also ask

What is protobuf timestamp?

Reference documentation and code samples for the Kubernetes Engine V1 API class Google::Protobuf::Timestamp. A Timestamp represents a point in time independent of any time zone or local calendar, encoded as a count of seconds and fractions of seconds at nanosecond resolution.

Is Google protobuf timestamp Nullable?

Protobuf messages are either present (possibly default) valued or optional but they can't be null.

What is protobuf type?

Protocol Buffer (Protobuf) provides two simpler options for dealing with values that might be of more than one type. The Any type can represent any known Protobuf message type. And you can use the oneof keyword to specify that only one of a range of fields can be set in any message.

What is the protobuf file format?

Protocol Buffers (Protobuf) is a free and open-source cross-platform data format used to serialize structured data. It is useful in developing programs to communicate with each other over a network or for storing data.


2 Answers

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)); 
like image 59
Evgeny Veretennikov Avatar answered Sep 23 '22 06:09

Evgeny Veretennikov


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.

like image 37
JesperE Avatar answered Sep 24 '22 06:09

JesperE