gpt4 book ai didi

c# - 如何将服务器时间转换为本地时间并处理夏令时

转载 作者:太空宇宙 更新时间:2023-11-03 19:56:53 24 4
gpt4 key购买 nike

我在 Godaddy 上托管我的网站(asp.net webforms、.Net 4.5、SQL Server 2012),他们(服务器)使用 Mountain Standard Time(-7UTC 时间比较)从未改变 并且遵守夏令时。

如果我这样做

Response.Write("UTC Time: " + DateTime.UtcNow.ToString() + "<br/>");
Response.Write("Server Time: " + DateTime.Now.ToString() + "<br/>");
Response.Write("Server DateTimeOffset: " + DateTimeOffset.Now.ToString() + "<br/>");

它将显示:

UTC Time: 9/18/2015 5:14:09 PM
Server Time: 9/18/2015 10:14:09 AM
Server DateTimeOffset: 9/18/2015 10:14:09 AM -07:00

但我的用户位于佐治亚州亚特兰大,那里确实遵守夏令时并根据timeanddate.com他们使用 EDT在夏天和EST在冬天

如何获得正确的用户当前时间?假设用户打开我的网络应用程序并点击 Show my time 按钮,它会显示正确的当前用户时间吗?

最佳答案

  1. 您永远不应依赖服务器的时区设置。因此 DateTime.Now 不应永远用于 ASP.NET 应用程序。

    还有许多其他原因可以避免 DateTime.Now。阅读:The case against DateTime.Now .

  2. 无论如何,服务器的本地时间永远不能保证是您网站用户的本地时间。如果是,那只是巧合。

  3. 获取用户所在时区的当前时间的最简单方法是通过 JavaScript:

    var now = new Date();

    虽然这是基于用户的时钟,但可能设置不正确。要对时间有任何保证,您必须使用服务器时钟的 UTC 时间,并应用用户的时区。

    您可能会考虑的一种方法是将服务器的 UTC 时间发送到客户端,然后将其加载到客户端的 JavaScript 中以将其投影到他们的时区:

    // C#
    string serverUtcTime = DateTime.UtcNow.ToString("o"); // "2015-09-18T17:53:15.6988370Z"

    // JS
    var now = new Date("2015-09-18T17:53:15.6988370Z");
  4. 实际上检测用户的时区是一个目前没有解决方案的难题。有些人可能会推荐 new Date().getTimezoneOffset(),但这只会为您提供当前的数字偏移量,而不是时区。 DST 的偏移量可能会发生变化,许多时区使用类似的偏移量。还有complications for historical dates near DST transitions那会对你不利。

    类似 jsTimeZoneDetect 的脚本可以猜测您的 IANA 时区 ID,例如东部时间的 America/New_York,但它们不是 100% 准确。如果您需要服务器上用户的时区,那么最终应该询问用户在您的应用程序中某处的时区。

  5. 在 .NET 中,您可以使用 Noda Time使用 IANA 时区。没有 Noda Time,.NET 有 TimeZoneInfo 类,但它只能使用 Windows 时区。

  6. 如果您确定用户位于佐治亚州亚特兰大(美国东部时区),那么您可以这样做:

    DateTime utc = DateTime.UtcNow;
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime eastern = TimeZoneInfo.ConvertTimeFromUtc(utc, tz);

    或者,使用野田时间和 IANA 时区 ID:

    Instant now = SystemClock.Instance.Now;
    DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
    ZonedDateTime eastern = now.InZone(tz);

关于c# - 如何将服务器时间转换为本地时间并处理夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32657578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com