protocol protobuffers protobuf google buffers array protocol-buffers

protocol-buffers - protobuffers - protocol buffer list



Tipo de fecha y hora para usar con Protobuf (3)

Estoy considerando usar Protocol Buffers para el intercambio de datos entre Linux y un sistema basado en Windows.

¿Cuál es el formato recomendado para enviar valores de fecha / hora (marca de tiempo)? El campo debe ser pequeño cuando se serializa.


En la última versión de protobuf (3.0): para C #, la marca de tiempo de un WellKnownType está disponible. Mira this


Hay un tipo de mensaje de Timestamp desde protobuf 3.0, así es como se crea en el modelo:

syntax = "proto3"; import "google/protobuf/timestamp.proto"; message MyMessage { google.protobuf.Timestamp my_field = 1; }

timestamp.proto archivo timestamp.proto contiene ejemplos de uso de la marca de tiempo, incluidos programas relacionados con Linux y Windows.

Ejemplo 1: Calcular la marca de tiempo desde POSIX time() .

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

Ejemplo 2: Calcular la marca de tiempo desde POSIX gettimeofday() .

struct timeval tv; gettimeofday(&tv, NULL); Timestamp timestamp; timestamp.set_seconds(tv.tv_sec); timestamp.set_nanos(tv.tv_usec * 1000);

Ejemplo 3: Calcular la marca de tiempo desde 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));


Aunque no está diciendo qué idiomas está usando o qué tipo de precisión necesita, sugeriría usar el tiempo Unix codificado en un int64 . Es bastante fácil de manejar en la mayoría de los idiomas y plataformas (consulte here un ejemplo de Windows), y Protobufs utilizará una varint-encoding manteniendo el tamaño pequeño sin limitar demasiado el rango representable.