【问题标题】:Asp.Net Core Convert UTC (YYYY-MM-DDThh:mm:ss.sTZD) input to LocalDateTimeAsp.Net Core 将 UTC (YYYY-MM-DDThh:mm:ss.sTZD) 输入转换为 LocalDateTime
【发布时间】:2020-05-08 01:20:00
【问题描述】:

我正在使用 MVC .Net Core API,该 API 将 DateTime 值注入为 YYYY-MM-DDThh:mm:ss.sTZD。但是,当它将数据发布到 SQL 数据库时,它会显示为 YYYY-MM-DDThh:mm:ss.s。 (以下问题示例)

输入

2020-01-21T17:05:30.3416751-05:00

写入数据库的内容

2020-01-21 22:05:30.343

鉴于输入格式在输入示例的情况下使用 -05:00 指定时区,我如何确保在写入数据库之前将值转换为本地?

我曾尝试在 Context 构造函数中更改我的模型构建器,但这对 EntityFramework 非常有用,但不适用于 EntityFramework Core。

【问题讨论】:

  • 你使用 SQL Sever 还是别的什么?数据库中日期的列类型是什么?
  • 是的,我使用 SQL Server。 Column 类型只是 DATETIME,当我尝试使用 Datetime 偏移量时,它不会在字段上留下“-05:00”,它只是将列重新转换为 YYYY-MM-DDThh:mm:ss.s 并且总是附加一个 +00
  • DateTime 是一个时区感知类,它会将日期四舍五入到最接近的四舍五入值。您是否尝试过使用DateTimeOffset 类而不是DateTime。它可能会解决您的问题docs.microsoft.com/en-us/dotnet/api/…

标签: c# sql asp.net-core asp.net-core-mvc entity-framework-core


【解决方案1】:

尝试像这样丢弃 TimeZone 信息:

// Parse date string to DateTimeOffset
var DateTimeWithOffset = DateTimeOffset.Parse("2020-01-21T17:05:30.3416751-05:00"); // 21.01.2020 17:05:30 -05:00

// Or Parse exact
// var DateTimeWithOffset = DateTimeOffset.ParseExact("2020-01-21T17:05:30.3416751-05:00", "yyyy-MM-ddTHH:mm:ss.fffffffK", CultureInfo.CurrentCulture);

// Leave only DateTime ignoring it's offset, which makes DateTime local
var DateTimeLocal = DateTimeWithOffset.DateTime; // 21.01.2020 17:05:30

然后将DateTimeLocal插入数据库。

如果您需要将时区信息保存在数据库中,此解决方案将不起作用。

【讨论】:

    【解决方案2】:

    所以我在上下文构造函数中添加了以下内容

            var dateTimeConverter = new ValueConverter<DateTime, DateTime>(
                v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Local));
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entityType.GetProperties())
                {
                    if (property.ClrType == typeof(DateTime) || property.ClrType == typeof(DateTime?))
                        property.SetValueConverter(dateTimeConverter);
                }
            }
    

    然后将输入转换为当地时间。

    但是,我发现输入不是我想的那样。我真的在 API 端将输入时间设为 UTC。我通过将数据发送到 API 的客户端应用程序有一个自定义 xml 序列化程序,它将时间转换为 yyyy-mm-ddthhmmss-stzd。所以我的问题是在客户端而不是在 API 端。

    奖励:有人告诉我,DB 列应该始终是 UTC 并保持原样。这取决于将数据库值转换为报告的人,以将列值从 UTC 转换为本地时间。

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2020-05-10
      • 1970-01-01
      • 2011-09-10
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多