C# .NET Noda将特定时区的本地日期时间转换为UTC的时间

C# .NET Noda将特定时区的本地日期时间转换为UTC的时间,c#,.net,datetime,utc,nodatime,C#,.net,Datetime,Utc,Nodatime,我正在使用野田佳彦时间将本地日期时间转换为UTC 这就是我到目前为止所做的: static string LocalTimeToUTC(string timeZone, string localDateTime) { var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss"); LocalDateTime ldt = pattern.Parse(localDateTime

我正在使用野田佳彦时间将本地日期时间转换为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
如您所见,由于时钟变化,2014年10月26日00:00:00缺失


我的问题是,有没有一种方法来处理这个问题,这样就不会错过几个小时?填充丢失的小时数?

由于时钟倒转,有两个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个值,具体取决于本地日期/时间是被跳过(由于向前跳转)、明确还是重复(由于向后跳转)。这可能会满足您的需求,但并不清楚您想要实现什么或您的输入数据代表什么。

顺便说一句,这里不需要进行文本解析-
LocalDateTime。FromDateTime
是您的朋友。谢谢您的回复。但是我不明白你的意思是什么?如果可能的话,请你把它写进密码里好吗?@Abz:确切地说,是什么意思?我的帖子里有很多。我不想在你还没有提供一个你想要达到的目标的清晰概念的情况下去推测性地编写代码。。。您的方法当前只能返回一个
字符串
,因此不清楚您希望它对不明确的本地值做什么。很抱歉,我应该更具体一些。基本上,我正在从数据库中检索日期(本地时间),并尝试将它们转换为各自时区的UTC,在本例中为欧洲/阿姆斯特丹。@Abz:对,所以这里的问题是,如果您的本地时间不明确,例如2014-10-26 02:00:00,则有两个UTC值将映射到同一本地时间。你想怎么处理?我不知道我想怎么处理。只要可以填充丢失的小时数,任何处理方法都可以。我很抱歉,如果我不够具体,因为这个时区的东西对我来说是新的。