J'envisage d'utiliser des tampons de protocole pour l'échange de données entre un système Linux et Windows.
Quel est le format recommandé pour l'envoi de valeurs de date/heure (horodatage)? Le champ doit être petit lorsqu'il est sérialisé.
Bien que vous ne disiez pas les langues que vous utilisez ou le type de précision dont vous avez besoin, je suggère d'utiliser temps Unix encodé dans un int64
. Il est assez facile à gérer dans la plupart des langues et des plates-formes (voir ici pour un exemple Windows), et Protobufs utilisera un varint-encoding en gardant la petite taille sans limiter la représentabilité gamme trop.
Il y a Timestamp
type de message depuis protobuf 3.0, voilà comment le créer dans le modèle:
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message MyMessage {
google.protobuf.Timestamp my_field = 1;
}
Le fichier timestamp.proto
Contient des exemples d'utilisation de l'horodatage, y compris ceux liés aux programmes Linux et Windows.
Exemple 1: calcul de l'horodatage à partir de POSIX
time()
.
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
Exemple 2: calcul de l'horodatage à partir 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: calcul de l'horodatage à partir 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));
Dans la dernière version de protobuf (3.0) - Pour C #, l'horodatage un WellKnownType est disponible. Vérifiez ceci