与Protobuf一起使用的日期和时间类型

时间:2010-08-26 11:42:25

标签: protocol-buffers

我正在考虑使用Protocol Buffers在Linux和基于Windows的系统之间进行数据交换。

发送日期/时间(时间戳)值的推荐格式是什么?序列化时该字段应该很小。

3 个答案:

答案 0 :(得分:62)

自protobuf 3.0以来有Timestamp个消息类型,它是如何在模型中创建的:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

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

timestamp.proto文件包含使用时间戳的示例,包括与Linux和Windows程序相关的内容。

  

示例1:从POSIX time()计算时间戳。

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

示例2:从POSIX gettimeofday()计算时间戳。

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

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

示例3:从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));

答案 1 :(得分:37)

虽然您没有说明您使用的语言或所需的精确度,但我建议您使用Unix time编码到int64。在大多数语言和平台上都很容易处理(对于Windows示例,请参阅here),Protobufs将使用varint-encoding来保持较小的尺寸,而不会过多限制可表示的范围。

答案 2 :(得分:5)

在最新的protobuf版本(3.0)中 - 对于C#,Timestamp可以使用WellKnownType。查看this