DateTimes 以不同的值存储在 Postgres 数据库中,Entity Framework Core 位于 ASP.NET Core 中

DateTimes are stored with different values in Postgres database with Entity Framework Core in ASP.NET Core

提问人:fingers10 提问时间:8/2/2023 最后编辑:fingers10 更新时间:8/2/2023 访问量:61

问:

我有一个和 .我进行了如下所示的简化来描述问题。OrderEntityOrderItemEntity

OrderEntity:

public class OrderEntity 
{
    public DateTime OrderDate { get; private set; } = DateTime.Now;
    public DateTimeOffset CreatedAt { get; protected set; }
}

OrderItemEntity:

public class OrderItemEntity 
{
    public DateTime? StartDate { get; private set; }
    public DateTimeOffset CreatedAt { get; protected set; }
}

下面是 中的请求本地化设置,Program.cs

Program.cs:

app.UseRequestLocalization(options =>
{
   var supportedCultures = new[] { "en", "en-IN", "en-US" };

   options.SetDefaultCulture("en-IN");
   options.AddSupportedCultures(supportedCultures);
   options.AddSupportedUICultures(supportedCultures);
   options.ApplyCurrentCultureToResponseHeaders = true;
})

每当创建订单时,将自动作为用户的输入传递,并将在保存并设置为 之前拦截所有实体。所有请求都将设置标头,在本例中,用户来自印度,因此它将是OrderDateDateTime.NowOrderItemStartDateLocal DateTimeEntity Framework CoreCreatedAtDateTimeOffset.NowAccept-Languageen-IN

应用程序分别在云中使用 postgres db 和 postgres db 运行。对于相同的输入,存储在数据库中的数据是不同的,这使得查询数据和向用户显示变得困难。on-premon-premcloud

现在,当用户通过运行英语印度语言的浏览器从用户创建订单时,以下是在存储的数据中观察到的差异。02 August 2023 02:00 PM

DBType C# 类型 输入 On Prem (英语: India Machine) AWS 云
不带时区的时间戳 日期时间 开始日期 01-08-2023 00.00(2023年8月1日凌晨12:00) 01-08-2023 00.00(2023年8月1日凌晨12:00) 31-07-2023 18.30(2023年7月31日 下午06时30分) - 与用户输入不同
不带时区的时间戳 日期时间 订单日期 - 02-08-2023 02.00(2023 年 8 月 2 日下午 2:00) - 与用户创建相同 02-08-2023 08.30(2023 年 8 月 2 日上午 8:30) - 与用户创建相同,但偏移差异
带时区的时间戳 DateTimeOffset 创建在 - 02-08-2023 02.00 +5.30(2023年8月2日 下午02:00) - 与用户创建日期相同 02-08-2023 02.00 +5.30(2023年8月2日 下午02:00) - 与用户创建日期相同

我现在明白了 DateTime 需要保留在数据库中的 UTC 中。但是,想知道在 AWS 云中对于给定请求如何与 .OrderDate (DateTime.Now)CreatedAt (DateTimeOffset.Now)

那么现在哪个是正确的呢?

  1. CreatedAt - DateTimeOffset.Now正确的存储方式是什么?或者我需要将其更改为 ?DateTimeOffset.UtcNow
  2. OrderDate - DateTime.Now需要更改为或列本身应该更改并存储?DateTime.UtcNowDateTimeOffsetDateTimeOffset.UtcNow
  3. StartDate- 用户输入(本地时间) - 在数据库中存储为 UTC DateTime - 这里应该做什么?这也需要改为列?DateTimeOffset
C# asp.net PostgreSQL ASP.Net-Core 日期时间

评论

0赞 Shay Rojansky 8/25/2023
上面缺少很多信息:正在使用哪个版本的 Npgsql,以及数据是如何插入和查询的。最好发布完整的代码示例,以便我们了解您在做什么。
0赞 fingers10 8/25/2023
@ShayRojansky我整理了一下。stackoverflow.com/a/76851870/10851213 - 你的这个回答帮助了我。我用UTC格式的DateTimeOffset完全替换了所有对数据库的写入/从数据库读取。

答: 暂无答案