2010-08-26 5 views
20

Je envisage d'utiliser des tampons de protocole pour l'échange de données entre un système Linux et Windows.Type de date et d'heure à utiliser avec Protobuf

Quel est le format recommandé pour l'envoi des valeurs date/heure (horodatage)? Le champ doit être petit lors de la sérialisation.

+0

Il est décevant que Google ne veut pas introduire un format datetime (Voir https://code.google.com/p/protobuf/issues/detail?id=324). Presque toutes les API que je connais transfèrent plusieurs dates par requête. – iGEL

Répondre

27

Bien que vous ne disiez pas quelles langues vous utilisez ou quel type de précision vous avez besoin, je suggère d'utiliser Unix time codé dans un int64. Il est assez facile à manipuler dans la plupart des langages et plates-formes (voir here pour un exemple Windows), et Protobufs utilisera un varint-encoding en gardant la taille petite sans trop limiter la plage représentable.

+8

utilise seulement 4 octets jusqu'en 2038 ... ne peut pas battre ça – JoelFan

+0

Hein? Qu'est-ce que tu racontes? – JesperE

+3

Unix temps consomme seulement 4 octets, ce qui est un codage assez efficace. Mais pour les dates après 2038, il faut plus de 4 octets. – JoelFan

1

Dans la dernière version de protobuf (3.0) - Pour C#, Timestamp un WellKnownType est disponible. Vérifier this

18

Il est Timestamp type de message depuis protobuf 3.0, c'est comment créer dans le modèle: fichier

syntax = "proto3"; 

import "google/protobuf/timestamp.proto"; 

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

timestamp.proto contient des exemples de l'utilisation Timestamp, y compris les programmes liés à Linux et Windows.

Exemple 1: horodatage de calcul à partir de POSIX time().

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

Exemple 2: Calculer Horodatage de POSIX gettimeofday().

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

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

Exemple 3: Calculer Horodatage 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));