Protobuf 时间戳 UTC
我尝试使用 Protobuff
模型映射 EF
模型:
EF model
[Table("entries")]
public class Entry
{
[Key]
public Guid Uid { get; set; }
public string Ip { get; set; }
public DateTime Entered { get; set; }
public string Code { get; set; }
public int Retries { get; set; } = 0;
public Guid? TokenUid { get; set; }
[ForeignKey("TokenUid")]
public Token Token { get; set; }
}
Protobuff model
message ProtoEntry {
string ip = 1;
google.protobuf.Timestamp Entered = 2;
string code = 3;
int32 retries = 4;
string token = 5;
}
Mapping
var entries = _db.Entries
.Include(x => x.Token)
.Where(x => x.Ip == requestWithToken.Ip || x.Token.Text == token)
.Select(x => new ProtoEntry
{
Code = x.Code,
Entered = DateTime.SpecifyKind(x.Entered, DateTimeKind.Utc).ToTimestamp(),
Ip = x.Ip,
Retries = x.Retries,
Token = x.Token.Text
}).ToList();
但它抛出异常:
System.ArgumentException: Conversion from DateTime to Timestamp requires the DateTime kind to be Utc (Parameter 'dateTime')
我也尝试过:DateTime.SpecifyKind(x.Entered.ToUniversalTime(), DateTimeKind.Utc).ToTimestamp()
但似乎没有效果。
有人可以帮助我吗?
更新:
I try to map EF
model with Protobuff
model:
EF model
[Table("entries")]
public class Entry
{
[Key]
public Guid Uid { get; set; }
public string Ip { get; set; }
public DateTime Entered { get; set; }
public string Code { get; set; }
public int Retries { get; set; } = 0;
public Guid? TokenUid { get; set; }
[ForeignKey("TokenUid")]
public Token Token { get; set; }
}
Protobuff model
message ProtoEntry {
string ip = 1;
google.protobuf.Timestamp Entered = 2;
string code = 3;
int32 retries = 4;
string token = 5;
}
Mapping
var entries = _db.Entries
.Include(x => x.Token)
.Where(x => x.Ip == requestWithToken.Ip || x.Token.Text == token)
.Select(x => new ProtoEntry
{
Code = x.Code,
Entered = DateTime.SpecifyKind(x.Entered, DateTimeKind.Utc).ToTimestamp(),
Ip = x.Ip,
Retries = x.Retries,
Token = x.Token.Text
}).ToList();
But It throws an exception:
System.ArgumentException: Conversion from DateTime to Timestamp requires the DateTime kind to be Utc (Parameter 'dateTime')
I also tried:DateTime.SpecifyKind(x.Entered.ToUniversalTime(), DateTimeKind.Utc).ToTimestamp()
But seems it doesn't have an effect.
Can somebody help me?
Updates:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通过将
Timestamp.FromDateTime()
更改为Timestamp.FromDateTimeOffset()
解决了该问题。protobuff 的官方 Google .NET 库包含日期时间类型的内置扩展:
这对我来说很糟糕。
The problem was solved by changing
Timestamp.FromDateTime()
toTimestamp.FromDateTimeOffset()
.Official Google .NET library for protobuff contains built-in extension for datetime types:
which is broken for me.