强制DateTime在特定时区下,仅给出具有未指定时区的DateTime

时间:2018-10-10 18:30:03

标签: c# datetime timezone

我有个约会,说“ 2016-10-20 20:34:60”。创建此日期时间时,我不确定如何指定此DateTime是基于服务器本地时区进行的。在这种情况下,它是“太平洋标准时间”。

我想同时显示为默认文本和数据文本。此数据文本将通过javascript用来将日期更改为用户的本地时间。

我是C#的新手,我正在设法把自己的头围起来。给出的许多示例都使用UTC时间。我们根据服务器本地时间存储日期。

我想确保显示的默认文本是正确的,无论我们是否处于夏时制模式,它都应反映当时的状态。

3 个答案:

答案 0 :(得分:0)

您可以使用

    TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time");

DateTime newDateTime = TimeZoneInfo.ConvertTime(existingDateTime, timeZoneInfo);

您可以找到更多信息和示例here以及所有时区here

答案 1 :(得分:0)

您可以使用

获取当前时区
TimeZoneInfo.Local

或者,您可以像这样获得当前偏移量:

DateTimeOffset.Now

您需要在日期和时间旁边将相关信息存储在数据库中。

编辑根据下面的注释,https://docs.microsoft.com/en-us/dotnet/standard/datetime/ TimeZone.CurrentTimeZone已被取代。请改用TimeZoneInfo.Local。答案已修改以反映这一点。

答案 2 :(得分:0)

通常,您不应该依赖服务器的本地时区。这是系统范围的设置,无需管理员权限即可轻松更改。这样做会使您容易难以跟踪生产错误,例如群集中一台服务器的时区设置与另一台服务器不同。如果将服务器移至其他位置(或移至云)并影响数据,也会带来问题。

服务器将时区故意设置为UTC也很常见,以免其日志文件受夏时制转换等影响。

如果无论您是否仍然想断言DateTime值都反映了计算机的本地时区,都可以通过确保在DateTimeKind.Local属性中设置.Kind来实现。这可以在构造函数参数中完成,或者在解析时使用DateTimeStyles.AssumeLocal,或者在现有值上使用DateTime.SpecifyKind。然后,您可以使用.ToUniversalTime()转换为UTC,然后再将其发送给最终用户。

但是,我强烈建议您改用DateTimeOffset。与DateTime不同,它将保留偏移量,并在大多数操作中将其考虑在内。如果您使用DateTimeOffsetDateTime构造一个DateTimeKind.Unspecified,则默认为当地时区。同样,如果通过解析(DateTimeOffset.Parse.TryParse.ParseExact.TryParseExact等)创建一个(如果输入字符串中没有偏移量),则默认为也是本地时区。

如何-这些对象中的任何一个都不会以正确考虑过渡的方式实际跟踪时区(例如,夏时制在太平洋时间在PST和PDT之间移动,反之亦然) 。如果这就是您要寻找的-抱歉,您对内置类型不满意。相反,您需要使用Noda Time开源库中的ZonedDateTime类。

您还说过:

  

...此数据文本将通过javascript用来将日期更改为用户的本地时间。

这并非不可能,但是除非您也有偏移量,否则要使JavaScript将日期和时间转换为用户的本地时区是非常困难的。将DateTimeOffset值序列化回浏览器将为您显示,但是如果您要要求用户更改该值,则必须以某种方式将其转换回去。

如果您只是在浏览器和服务器之间来回传递UTC值,则要容易得多。然后,您可以在浏览器中将UTC转换为本地时间,反之亦然。 (至少对于日期和时间值。不要尝试转换仅日期的值。)