繁体   English   中英

如何从 .NET Core 中的 DateTime 中去除时区

[英]How to strip timezone from DateTime in .NET Core

我有一个用例,我不确定如何以一种好的方式解决。 我目前正在开发一个.Net Core 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:002020-09-16T23:00:00

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

  • 另一种选择是使用DateTimeOffset ,我已经尝试过但不能使用localTime进行时间转换。

我的问题是。 是否无法自定义转换以在到达控制器之前剥离时区

通常,当您处理包含时区偏移量的DateTimeOffset时间数据时, 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方法。

使用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是非时区意识值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM