2010-08-26 6 views
20

Ich erwäge Protokollpuffer für den Datenaustausch zwischen einem Linux-und einem Windows-basierten System zu verwenden.Datum und Uhrzeit Typ für die Verwendung mit Protobuf

Was ist das empfohlene Format für das Senden von Datum/Uhrzeit (Zeitstempel) Werten? Das Feld sollte klein sein, wenn es serialisiert wird.

+0

Es ist enttäuschend, dass Google will nicht ein Datumsformat (siehe https://code.google.com/p/protobuf/issues/detail?id=324) einzuführen. Fast jede API, die ich kenne, überträgt mehrere Daten pro Anfrage. – iGEL

Antwort

27

Obwohl Sie nicht sagen, welche Sprachen Sie verwenden oder welche Art von Genauigkeit Sie benötigen, würde ich vorschlagen, Unix time codiert in eine int64. Es ist ziemlich einfach in den meisten Sprachen und Plattformen zu handhaben (siehe here für ein Windows-Beispiel), und Protobufs verwenden einen varint-encoding, der die Größe klein hält, ohne den darstellbaren Bereich zu sehr einzuschränken.

+8

verwendet nur 4 Bytes bis 2038 ... kann nicht schlagen – JoelFan

+0

Huh? Worüber redest du? – JesperE

+3

Unix-Zeit verbraucht nur 4 Bytes, was eine ziemlich effiziente Codierung ist. Aber für Daten nach 2038 benötigt es mehr als 4 Bytes – JoelFan

1

In der neuesten Protobuf-Version (3.0) - Für C#, Timestamp ist ein WellKnownType verfügbar. Prüfen this

18

Es gibt Timestamp Nachrichtentyp seit protobuf 3.0, das ist, wie es in Modell zu erstellen:

syntax = "proto3"; 

import "google/protobuf/timestamp.proto"; 

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

timestamp.proto Datei enthält Beispiele für Zeitstempel verwendet, einschließlich der im Zusammenhang mit Linux und Windows-Programmen.

Beispiel 1: Zeitstempel von POSIX time() berechnen.

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

Beispiel 2: Compute-Zeitstempel von POSIX gettimeofday().

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

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

Beispiel 3: Compute Zeitstempel 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)); 
Verwandte Themen