我有个约会,说“ 2016-10-20 20:34:60”。创建此日期时间时,我不确定如何指定此DateTime是基于服务器本地时区进行的。在这种情况下,它是“太平洋标准时间”。
我想同时显示为默认文本和数据文本。此数据文本将通过javascript用来将日期更改为用户的本地时间。
我是C#的新手,我正在设法把自己的头围起来。给出的许多示例都使用UTC时间。我们根据服务器本地时间存储日期。
我想确保显示的默认文本是正确的,无论我们是否处于夏时制模式,它都应反映当时的状态。
答案 0 :(得分:0)
您可以使用
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time");
DateTime newDateTime = TimeZoneInfo.ConvertTime(existingDateTime, timeZoneInfo);
答案 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
不同,它将保留偏移量,并在大多数操作中将其考虑在内。如果您使用DateTimeOffset
从DateTime
构造一个DateTimeKind.Unspecified
,则默认为当地时区。同样,如果通过解析(DateTimeOffset.Parse
,.TryParse
,.ParseExact
,.TryParseExact
等)创建一个(如果输入字符串中没有偏移量),则默认为也是本地时区。
如何-这些对象中的任何一个都不会以正确考虑过渡的方式实际跟踪时区(例如,夏时制在太平洋时间在PST和PDT之间移动,反之亦然) 。如果这就是您要寻找的-抱歉,您对内置类型不满意。相反,您需要使用Noda Time开源库中的ZonedDateTime
类。
您还说过:
...此数据文本将通过javascript用来将日期更改为用户的本地时间。
这并非不可能,但是除非您也有偏移量,否则要使JavaScript将日期和时间转换为用户的本地时区是非常困难的。将DateTimeOffset
值序列化回浏览器将为您显示,但是如果您要要求用户更改该值,则必须以某种方式将其转换回去。
如果您只是在浏览器和服务器之间来回传递UTC值,则要容易得多。然后,您可以在浏览器中将UTC转换为本地时间,反之亦然。 (至少对于日期和时间值。不要尝试转换仅日期的值。)