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.