Protobuf 时间戳 UTC

发布于 2025-01-12 14:22:04 字数 1656 浏览 3 评论 0原文

我尝试使用 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()

但似乎没有效果。
有人可以帮助我吗?

更新:

  1. 查询效果很好。 输入图片此处描述

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:

  1. Query works good.
    enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无边思念无边月 2025-01-19 14:22:04

通过将 Timestamp.FromDateTime() 更改为 Timestamp.FromDateTimeOffset() 解决了该问题。

protobuff 的官方 Google .NET 库包含日期时间类型的内置扩展:

public static Timestamp ToTimestamp(this DateTime dateTime)
{
     return Timestamp.FromDateTime(dateTime);
}

这对我来说很糟糕。

The problem was solved by changing Timestamp.FromDateTime() to Timestamp.FromDateTimeOffset().

Official Google .NET library for protobuff contains built-in extension for datetime types:

public static Timestamp ToTimestamp(this DateTime dateTime)
{
     return Timestamp.FromDateTime(dateTime);
}

which is broken for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文