Protocol buffers 用于Protobuf的日期和时间类型
我正在考虑在Linux和基于Windows的系统之间使用协议缓冲区进行数据交换Protocol buffers 用于Protobuf的日期和时间类型,protocol-buffers,Protocol Buffers,我正在考虑在Linux和基于Windows的系统之间使用协议缓冲区进行数据交换 发送日期/时间(时间戳)值的推荐格式是什么?序列化时字段应该很小。虽然您没有说明使用的是哪种语言或需要何种精度,但我建议使用encoded into aint64。它在大多数语言和平台中都很容易处理(请参阅Windows示例),protobuf将使用一个保持小尺寸而不过度限制可表示范围的方法。在最新的protobuf版本(3.0)中,对于C#,时间戳有一个广为人知的类型。检查自protobuf 3.0以来有时间戳消息
发送日期/时间(时间戳)值的推荐格式是什么?序列化时字段应该很小。虽然您没有说明使用的是哪种语言或需要何种精度,但我建议使用encoded into a
int64
。它在大多数语言和平台中都很容易处理(请参阅Windows示例),protobuf将使用一个保持小尺寸而不过度限制可表示范围的方法。在最新的protobuf版本(3.0)中,对于C#,时间戳有一个广为人知的类型。检查自protobuf 3.0以来有时间戳
消息类型,这就是如何在模型中创建它:
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message MyMessage {
google.protobuf.Timestamp my_field = 1;
}
timestamp.proto
文件包含使用时间戳的示例,包括与Linux和Windows程序相关的示例
示例1:从POSIXtime()
计算时间戳
示例2:从POSIXgettimeofday()
计算时间戳
示例3:从Win32计算时间戳GetSystemTimeAsFileTime()
FILETIME-ft;
GetSystemTimeAsFileTime(&ft);
UINT64刻度=((UINT64)ft.dwHighDateTime)2038年之前仅使用4字节…这比不上Unix时间仅使用4字节,这是一种非常有效的编码方式。但对于2038年之后的日期,它需要超过4字节。Unix时间未指定占用的字节数,它被定义为从纪元开始的秒数。传统上,它被表示为32位integer,但现在大多数操作系统都使用64位整数。我的观点是:如果你在protobuf中使用Unix时间,你将只使用4个字节…这意味着Unix时间很好…这就是我要说的!作为旁白,我要补充一条警告,2038年后,4个字节将不再足够,不是吗?5?可变编码。JavaScript呢?不确定这是w吗这是一个完整的答案,但是这个问题询问时间戳和日期,所以考虑GooGel.Type日期,当你不需要更高的精度时。@ McSEYDEL:OP要求一个“小”。数据类型.google.type.Date是3个整数,比简单地发送一个带有Unix时间戳的int64精度要低。很少有需要使用google.type.Date的情况,除了它易于人类阅读之外。当然,Protobuf的二进制格式将尽可能地将3个整数组合在一起,但一般来说,如果大小重要,它似乎并不理想s
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
struct timeval tv;
gettimeofday(&tv, NULL);
Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
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));