【问题标题】:.NET Noda Time Converting Local DateTime To UTC for a specific Timezone.NET Noda 时间将本地日期时间转换为特定时区的 UTC
【发布时间】:2016-06-14 15:33:59
【问题描述】:

我正在使用 Noda Time 将 local datetime 转换为 UTC

这是我目前所拥有的:

static string LocalTimeToUTC(string timeZone, string localDateTime)
{
    var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss");
    LocalDateTime ldt = pattern.Parse(localDateTime).Value;
    ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]);
    Instant instant = zdt.ToInstant();
    ZonedDateTime utc = instant.InUtc();
    string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

    return output;
}

static void Main(string[] args)
{
    foreach (DateTime d in myDates)
    {
        DateTime utcTime = Convert.ToDateTime(LocalTimeToUTC("Europe/Amsterdam", d.ToString()));
        Console.WriteLine(utcTime);
    }

    Console.ReadKey();
}

问题在于夏令时:当时钟倒退 1 小时时。缺少一个小时,请参阅下面的结果。

   25/10/2014 19:00:00
   25/10/2014 20:00:00
   25/10/2014 21:00:00
   25/10/2014 22:00:00
   25/10/2014 23:00:00
   26/10/2014 01:00:00
   26/10/2014 02:00:00

如您所见,由于时钟更改,缺少 26/10/2014 00:00:00。

我的问题是,有没有办法处理这个问题,以免错过时间?填补缺失的小时数?

【问题讨论】:

  • 顺便说一句,这里不需要通过文本解析 - LocalDateTime.FromDateTime 是你的朋友。

标签: c# .net datetime utc nodatime


【解决方案1】:

您错过了一个小时,因为由于时钟倒退,有两个 UTC 时刻都对应于同一本地时间。避免“错过时间”的唯一方法是为不明确的本地时间发出 两个 条目。

让我们反过来看一张表格,从 UTC 到本地时间,每经过一个小时一个条目:

UTC                        Local time
2014-10-25 21:00:00Z       2014-10-25 23:00:00 +02
2014-10-25 22:00:00Z       2014-10-26 00:00:00 +02
2014-10-25 23:00:00Z       2014-10-26 01:00:00 +02
2014-10-26 00:00:00Z       2014-10-26 02:00:00 +02
2014-10-26 01:00:00Z       2014-10-26 02:00:00 +01 (clocks back!)
2014-10-26 02:00:00Z       2014-10-26 03:00:00 +01

所以左侧有 6 个不同的值,而右侧只有 5 个不同的值。

您可以使用DateTimeZone.MapLocal(LocalDateTime) 来获取ZoneLocalMapping,这将包括 0、1 或 2 个值,具体取决于本地日期/时间是否被跳过(由于向前跳转)、明确或重复(由于跳回来)。这可能给你你想要的,但不清楚你想要达到什么或你的输入数据代表什么。

【讨论】:

  • 感谢您的回复。但是我不明白你的意思是什么?如果可能的话,你能把它放在代码中吗?
  • @Abz:确切地说是什么?我的帖子里有很多。当您没有清楚地了解您要实现的目标时,我宁愿不要投机地编写代码......您的方法目前只能返回一个 string,所以不清楚您想要它做什么具有模棱两可的局部值。
  • 抱歉,我应该更具体一点。基本上,我正在从数据库中检索日期(本地时间)并尝试将它们转换为相应时区的 UTC,在本例中为欧洲/阿姆斯特丹。
  • @Abz:是的,所以这里的问题是,如果你有一个不明确的当地时间,例如2014-10-26 02:00:00,有两个 UTC 值将映射到同一本地时间。你想怎么处理?
  • 我不确定我想如何处理它。只要可以填充缺失的时间,任何处理它的方法都可以。如果我不够具体,我很抱歉,因为这个时区的东西对我来说是新的。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多