Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protocol buffers 用于Protobuf的日期和时间类型_Protocol Buffers - Fatal编程技术网

Protocol buffers 用于Protobuf的日期和时间类型

Protocol buffers 用于Protobuf的日期和时间类型,protocol-buffers,Protocol Buffers,我正在考虑在Linux和基于Windows的系统之间使用协议缓冲区进行数据交换 发送日期/时间(时间戳)值的推荐格式是什么?序列化时字段应该很小。虽然您没有说明使用的是哪种语言或需要何种精度,但我建议使用encoded into aint64。它在大多数语言和平台中都很容易处理(请参阅Windows示例),protobuf将使用一个保持小尺寸而不过度限制可表示范围的方法。在最新的protobuf版本(3.0)中,对于C#,时间戳有一个广为人知的类型。检查自protobuf 3.0以来有时间戳消息

我正在考虑在Linux和基于Windows的系统之间使用协议缓冲区进行数据交换


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

虽然您没有说明使用的是哪种语言或需要何种精度,但我建议使用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:从POSIX
time()
计算时间戳

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

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