【问题标题】:How to strip timezone from DateTime in .NET Core如何在 .NET Core 中从 DateTime 中剥离时区
【发布时间】:2021-01-03 18:08:15
【问题描述】:

我有一个用例,我不确定如何以一种好的方式解决。 我目前正在开发一个 .Net 核心 WebApi,它正在从全球各个当前系统接收数据。然后我对其进行处理,最后通过 oData 端点将其提交给 SAP

我遇到的问题是我在正文有效负载中收到的参数是DateTime。以前我没有任何问题。但不久前,我开始从其他系统获取数据,该系统以稍微不同的方式提供数据。

以前这是我得到的格式:2020-09-16T16:30:00 没问题。但是新系统看起来是这样的:2020-09-16T16:00:00 -05:00也可以以+08:00结尾。

我面临的问题是 SAP 需要在 本地时间 获得。但在我的代码中,当我在控制器中看到传入的有效负载时,它会将2020-09-16T16:00:00 -05:00 转换为2020-09-16T23:00:00

  • 我已经搜索了很多以找到解决方案。但 99% 只建议使用 UTC 时间,这对我来说不是一个选项。

  • 另一种选择是使用DateTimeOffset,我已经尝试过但无法将时间转换为使用localTime

我的问题是。 timezone 在到达控制器之前是否无法自定义转换以去除它?

【问题讨论】:

  • 你想要一些奇怪的东西......这通常意味着使用字符串操作进行自定义绑定或切换到数据类型的字符串并在控制器中进行字符串操作。我强烈建议停下来想想你在做什么 - 01:23 -01:00, 01:23 -02:00, 01:23 -03:00 是 3 个不同的时间间隔一小时...剥离他们的时区和说所有发生在 1:23 听起来不正确(这可能是你的目标,只是一个奇怪的目标)
  • @AlexeiLevenkov Yearh 我知道这是一个奇怪的目标。我的问题是,我受制于我收到的东西和需要交付的东西。如果您对解决方案有其他建议,我欢迎。
  • 不,我没有看到任何其他解决方案,除了我已经建议过...您可能会使用stackoverflow.com/questions/6676856/… 获得更好的代码来剥离时区...但是您必须切换到字符串或实施自定义模型绑定/自定义 JSON 解析取决于此参数的位置。

标签: c# .net api .net-core


【解决方案1】:

例如使用DateTime.Parse()

string timeInString1 = "2020-09-16T16:00:00 -05:00";
DateTime moment1 = DateTime.Parse(timeInString1);

string timeInString2 = "2020-09-16T16:00:00 +08:00";
DateTime moment2 = DateTime.Parse(timeInString2);

string timeInString3 = "2020-09-16T16:30:00";
DateTime moment3 = DateTime.Parse(timeInString3);

momen1momen2moment3 是非时区感知值。

【讨论】:

    【解决方案2】:

    通常,当您处理包含时区偏移量的日期时间数据时,DateTimeOffset 类型是一个不错的起点。可以将示例字符串 2020-09-16T16:00:00 -05:00 传递给 DateTimeOffset.Parse() 以获得正确的 DTO 值,并附加时区信息。从那里您可以获得本地时间、UTC 时间或去掉时区的DateTime 值。

    string source = "2020-09-16T16:00:00 -05:00";
    string fmt = @"yyyy-MM-dd\THH:mm:ss zzz"
    
    // Same as input
    Console.WriteLine(DateTimeOffset.Parse(source).ToString(fmt));
    
    // Adjusted to your local timezone
    Console.WriteLine(DateTimeOffset.Parse(source).ToLocalTime().ToString(fmt));
    
    // DateTime portion of the source, timezone offset ignored
    Console.WriteLine(DateTimeOffset.Parse(source).DateTime.ToString());
    

    通过 UtcDateTime 属性获取 UTC 时间也很简单。

    听起来你想要的是最后一个 - 只是输入字符串中的日期和时间,时区偏移被剥离。如果你只想要对应的当地时间,那么DateTime.Parse 应该直接给你。

    JsonSerializer 类不支持DateTimeOffset 的这种格式,因此在点击控制器之前转换它可能会遇到一些麻烦。在这种情况下,您需要接受一个字符串并在您的代码中手动进行转换。您可能还需要研究TryParseExact 方法。

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2015-01-20
      • 2016-04-03
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多