2016-06-14 2 views
1

Я использую Noda Время для преобразования local datetime в UTC..NET Noda Time Converting 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(); 
} 

Проблема с Daylight Savings: Когда часы идет 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 отсутствует из-за смены часов.

Мой вопрос в том, что есть способ справиться с этим, чтобы отсутствовали часы? Заполнить недостающие часы?

+0

В стороне, нет необходимости проходить через синтаксический анализ текста здесь - 'LocalDateTime.FromDateTime' - ваш друг. –

ответ

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 значения в зависимости от того, была ли местная дата/время пропускаются (из-за скачка вперед), однозначный или повторить (из-за скачка обратно) , То, что может дать вам то, что вы хотите, но не совсем ясно, чего вы пытаетесь достичь или что представляют ваши входные данные.

+0

Благодарим вас за ответ. Однако я не понимаю, что вы подразумеваете под этим? Не могли бы вы поместить это в код, если это возможно? –

+0

@Abz: К чему, точно? В моем посте много чего. Я бы предпочел не спекулятивно писать код, когда вы не представили четкое представление о том, чего вы пытаетесь достичь ... ваш метод в настоящее время может вернуть только одну строку, поэтому неясно, что вы хотите сделать с неоднозначными местными значениями. –

+0

Простите, я должен был быть более конкретным. В основном, я беру даты (местное время) из базы данных и пытаюсь преобразовать их в UTC для соответствующего часового пояса, который в этом случае является Европой/Амстердамом. –

Смежные вопросы