C# 中的 Google.Protobuff timestamp.proto

Kha*_*aba 3 c# protocol-buffers

我已经使用 google.proto.Timestamp 成功编译了我的 .proto 文件,并使用 protoc 生成了 .cs 文件。我遇到的唯一问题是在我的 c# 代码中初始化。

我尝试了以下方法:

.proto 文件

message teststamp
{
    string Name = 1 ;
    string address = 2;
    google.protobuf.Timestamp _timeStamp = 3;
}
Run Code Online (Sandbox Code Playgroud)

C#文件

teststamp test = new teststamp();
test.Name = "Test";
test.address = "Test_Test_TEST"
//Example 2 : POSIX
test._timeStamp.Seconds = DateTime.Now.Second;
test._timeStamp.Nanos = DateTime.Now.Second*1000 ;
Run Code Online (Sandbox Code Playgroud)

上面的编译没有错误,但给了我这个错误:Object reference not set to an instance of an object.我尝试了一些其他方法,但由于帮助较少,它无法修复错误。

请帮我解决这个问题

谢谢

Ste*_*don 16

大多数人可能只想使用辅助方法:

using Google.Protobuf.WellKnownTypes;

var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)
Run Code Online (Sandbox Code Playgroud)

  • 如果您有 DateTime 实例,则+1: var timestamp = Timestamp.FromDateTime(_mydatetime.ToUniversalTime()) (2认同)

val*_*asm 6

任何人的完整示例。更多信息关于 Google.Protobuf.WellKnownTypes.Timestamp 的官方文档

原型

syntax = "proto3";

option csharp_namespace = "Test";
import "google/protobuf/timestamp.proto";

package OnlineGrpc;
service OnlineGrpcService {
  rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
}
message SendMessageRequest{
    google.protobuf.Timestamp requestDate = 1;
}

message SendMessageResponse{
    google.protobuf.Timestamp responseDate = 1;
}
Run Code Online (Sandbox Code Playgroud)

C# 发送请求

var request = new SendMessageRequest();
request.requestDate = DateTime.Now.ToTimestamp();
request.requestDate = DateTimeOffset.Now.ToTimestamp();
Run Code Online (Sandbox Code Playgroud)

C# 读取响应

var response = new SendMessageResponse();
DateTimeOffset dateOffset = response.responseDate.ToDateTimeOffset();
DateTime date = response.responseDate.ToDateTime();
Run Code Online (Sandbox Code Playgroud)


Joh*_* Wu 5

这是我将现有 DateTime 实例转换为 Timestamp 的尝试:

// doc.CreateOn is a DateTime 
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));
Run Code Online (Sandbox Code Playgroud)


Opt*_*ion 4

时间戳是类,因此您必须首先像这样创建它:

test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }
Run Code Online (Sandbox Code Playgroud)