2010-08-26 13 views
20

Estoy considerando utilizar Buffers de Protocolo para el intercambio de datos entre Linux y un sistema basado en Windows.Tipo de fecha y hora para usar con Protobuf

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

+0

Es decepcionante que Google no quiere introducir un formato de fecha y hora (Ver https://code.google.com/p/protobuf/issues/detail?id=324). Casi todas las API que conozco transfieren varias fechas por solicitud. – iGEL

Respuesta

27

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

+8

usa solo 4 bytes hasta 2038 ... no puede superar ese – JoelFan

+0

¿Huh? ¿De qué estás hablando? – JesperE

+3

El tiempo Unix consume solo 4 bytes, lo cual es una codificación bastante eficiente. Pero para las fechas posteriores a 2038, requiere más de 4 bytes – JoelFan

1

En la última versión de protobuf (3.0) - Para C#, Timestamp está disponible un WellKnownType. Compruebe this

18

Hay Timestamp tipo de mensaje desde protobuf 3.0, que es la forma de crear en el modelo:

syntax = "proto3"; 

import "google/protobuf/timestamp.proto"; 

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

timestamp.proto archivo contiene ejemplos de marca de tiempo utilizando, incluso en relación con los programas de Linux y Windows.

Ejemplo 1: Compute Timestamp de POSIX time().

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

Ejemplo 2: Calcular Timestamp de 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 Timestamp de 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)); 
Cuestiones relacionadas