【问题标题】:how to get local timezone on azure service如何在 azure 服务上获取本地时区
【发布时间】:2015-08-10 10:24:18
【问题描述】:

我有一个在天蓝色云上运行的服务。该服务每 1 分钟运行一次,并从 ftp 服务器中选择一些文件。这些文件具有 Datetime 字段而不是 datetimeoffset,当服务读取时,这些字段将成为 UTC 日期。这些 FTP 服务器位于不同的时区。

例如,其中一个 ftp 位于 GMT 时区。假设文件的日期为 2015 年 12 月 5 日时间 12:15。这被服务读取为 UTC(因为没有收到时区)并以 12/5/2015: 12:15:00 +0:00 的形式存储在数据库中,而它应该是 2015 年 12 月 5 日:11:15:00 +0:00。

我仍然想将数据库中的日期保存为 UTC,需要一种方法来获取这些 ftp 时区,以便我可以正确解析日期。

问题是我们无法对文件进行任何更改。 云服务有什么办法可以获取这些 FTP 的时区吗?

【问题讨论】:

    标签: azure timezone azure-web-app-service


    【解决方案1】:

    这里没有任何 Azure 特定于您想要的东西,但您可以推出自己的解决方案。

    您必须做一些花哨的事情来猜测 FTP 服务器的时区,这将涉及对服务器进行 DNS 查找以找出它的 IP 地址,将该 IP 地址映射到一个城市,然后查找城市的时区。你可以这样做,但很容易出错。

    有一个更简单、更可靠的选择。听起来您的 FTP 服务器列表是相当静态的。您只需创建一个查找表,说明每个 FTP 服务器所在的时区,然后使用该表来确定您应该使用哪个时区偏移量。

    【讨论】:

      【解决方案2】:

      最佳实践:服务器端代码不应依赖于托管代码的服务器的时区或文化设置。相反,应该在代码本身中解决这些问题。

      例如,假设您的服务是用 C# / .NET 编写的,您可能有这样的代码:

      string s = "12/5/2015 12:15 PM";  // from the file
      DateTime dt = DateTime.Parse(s);
      DateTime utc = dt.ToUniversalTime();
      

      以上代码在ToUniversalTime 函数期间依赖于服务器的本地时区。它还依赖于Parse 函数期间的服务器文化。

      相反,您应该了解输入文件的时区和文化。例如:

      string s = "12/5/2015 12:15 PM";  // from the file
      DateTime dt = DateTime.ParseExact(s, "M/d/yyyy h:mm tt", CultureInfo.InvariantCulture);
      TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
      DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tz);
      

      此代码提供 CET/CEST 时区,还提供使用不变文化的精确输入格式。

      【讨论】:

      • 如果您的服务托管在 Windows 以外的平台上,TimeZoneInfo.FindSystemTimeZoneById 将失败。
      • @ΕГИІИО - 在 .NET Core 发布之前,这个问题已经被问及并得到了很好的回答。对于现代.NET,您是正确的。可以使用等效的 IANA 时区 ID(例如 Europe/Budapest),也可以使用我的 TimeZoneConverter 库,它可以让您在任何受支持的平台上使用任一形式的时区。
      • 真棒@Matt,我亲身体验了这个问题,然后在这个问题上发表了评论,没有检查日期。虽然我打算使用 NodaTime,但您的库似乎专门解决了这个问题。谢谢!
      【解决方案3】:

      迟到了,但我想我会发布我的解决方案来帮助其他人:

       TimeZone localZone = TimeZone.CurrentTimeZone;
      
       var cetZone = TimeZoneInfo.FindSystemTimeZoneById(localZone.StandardName);
       var cetTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cetZone);
      
       DateCreated = Convert.ToDateTime(cetTime.ToString());
      

      在我的例子中,localZone.StandardName 给了我“南非标准时间”,我相信它是 GMT+2。

      希望这对其他人有所帮助!

      干杯

      【讨论】:

      • TimeZone.CurrentTimeZone 现在已过时。请改用TimeZone.Local。而TimeZoneInfo.FindSystemTimeZoneById() 不接受TimeZone.StandardName,而是TimeZone.Id
      • 感谢您提供此信息,非常感谢。
      猜你喜欢
      • 2011-06-09
      • 2013-11-02
      • 2020-11-25
      • 2012-11-08
      • 1970-01-01
      • 2012-01-28
      • 2023-03-25
      • 2023-04-01
      • 2020-03-21
      相关资源
      最近更新 更多