我正在考虑使用Protocol Buffers在Linux和基于Windows的系统之间进行数据交换.
什么是推荐的发送日期/时间(时间戳)值的格式?序列化时该字段应该很小.
Evg*_*kov 84
Timestamp
自protobuf 3.0以来就有消息类型,这就是如何在模型中创建它:
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message MyMessage {
google.protobuf.Timestamp my_field = 1;
}
Run Code Online (Sandbox Code Playgroud)
timestamp.proto
file包含使用Timestamp的示例,包括与Linux和Windows程序相关的示例.
示例1:计算POSIX的时间戳
time()
.
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
Run Code Online (Sandbox Code Playgroud)
示例2:从POSIX计算时间戳
gettimeofday()
.
struct timeval tv;
gettimeofday(&tv, NULL);
Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
Run Code Online (Sandbox Code Playgroud)
示例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));
Run Code Online (Sandbox Code Playgroud)
Jes*_*erE 38
虽然你没有说你正在使用哪种语言或者你需要什么样的精度,但我建议使用Unix时间编码成a int64
.它在大多数语言和平台上都很容易处理(请参阅此处的Windows示例),Protobufs将使用varint-encoding来保持较小的大小而不会过多地限制可表示的范围.
归档时间: |
|
查看次数: |
54606 次 |
最近记录: |