2014-12-30 3 views
0

У меня есть локальное время в строчном формате: «yyyy-MM-dd HH: mm: ss» и часовой пояс IANA за это время (например, «Европа/Лондон ").Как преобразовать зону IANA + дата-время в UTC + Смещение с использованием NodaTime

Как преобразовать, что в C#, может быть, с помощью NodaTime, к UTC + TimeZone Смещение строки

например "yyyy-MM-dd HH: mm: ss + 01: 00"?

Я даже не знаю с чего начать!

Это насколько я могу (я боюсь, что я новичок в C sharp): Я понимаю, что мне нужно преобразовать его в одно мгновение, но просто не могу получить доступ к библиотеке.

string dateTime = "2014-12-31 12:30:00"; 
string IANA = "Europe/London"; 
Instant instDateTime = NodaTime.Instant.FromDateTimeUtc(Convert.ToDateTime(dateTime)); 
string outputUTC = string.Format("yyyy-MM-dd HH:mm:ssZ", instDateTime); 

Благодаря Matt (см ответить ниже), теперь у меня есть функции, необходимые мне (Обратите внимание, что в конце концов, что мне было нужно UTC, а не время дата + смещение):

Что такое мало беспокоит то, что говорит, что Европа/Москва UTC + 04: 00, в то время как на самом деле UTC + 03: 00 начиная с 26 октября 2014 г.

static void Main(string[] args) 
    { 
     string dateTime = "2014-12-31T12:30:00"; 
     string timeZone = "Europe/Moscow"; 

     Console.WriteLine(timeZone + " Local time '" + dateTime + "' to Zulu time"); 
     Console.WriteLine(ConvertIANALocalTimeToZulu(timeZone, dateTime)); 
     Console.WriteLine(); 
     Console.WriteLine("Zulu time '" + dateTime + "' to " + timeZone + " local time"); 
     Console.WriteLine(ConvertZuluTimeToIANALocalTime(timeZone, dateTime)); 

     Console.ReadLine(); 
    } 

    static string ConvertIANALocalTimeToZulu(string timeZoneIANA, string localDateTime) 
    { 
     var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss"); 
     LocalDateTime ldt = pattern.Parse(localDateTime).Value; 
     ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZoneIANA]); 
     Instant instant = zdt.ToInstant(); 
     ZonedDateTime zulu = instant.InUtc(); 
     ////string output = zulu.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture); 
     string output = zulu.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture); 

     return output; 
    } 

    static string ConvertZuluTimeToIANALocalTime(string timeZoneIANA, string zuluDateTime) 
    { 
     var pattern = InstantPattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss"); 
     Instant instant = pattern.Parse(zuluDateTime).Value; 
     ZonedDateTime zdt = instant.InZone(DateTimeZoneProviders.Tzdb[timeZoneIANA]); 
     ////string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture); 
     string output = zdt.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture); 

     return output; 
    } 
+5

Начните с кода для публикации. Даже ужасно сломанный код позволяет кому-то помочь вам в течение первого препятствия, которое вы не поняли. – bmike

+0

Показать приличное усилие, и кто-то поможет вам! – mybirthname

+0

Я прочитал это сообщение в отношении преобразования текста из IANA в Windows, но я не понимаю, что здесь происходит. [iana to conversion time zone conversion] (http://stackoverflow.com/questions/17348807/how-to-translate-between-windows-and-iana-time-zones) –

ответ

8

неясно из вашего вопроса, если вы имеете в виду, что первоначальное значение было в UTC или по местному времени.

Если это в UTC, то сделайте следующее:

string dateTime = "2014-12-31 12:30:00"; 
string timeZone = "Europe/London"; 

var pattern = InstantPattern.CreateWithInvariantCulture("yyyy-MM-dd HH:mm:ss"); 
Instant instant = pattern.Parse(dateTime).Value; 
ZonedDateTime zdt = instant.InZone(DateTimeZoneProviders.Tzdb[timeZone]); 
string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture); 

Если это местное время, то сделать это вместо того, чтобы:

string dateTime = "2014-12-31 12:30:00"; 
string timeZone = "Europe/London"; 

var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy-MM-dd HH:mm:ss"); 
LocalDateTime ldt = pattern.Parse(dateTime).Value; 
ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]); 
string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture); 

Кроме того - следует отметить, что в декабре, Лондон на GMT (UTC + 00: 00) - так что выход любой из функций будет "2014-12-31 12:30:00+00:00" для значений, которые вы указали.

+0

Привет, Мэтт, извините, я не был чист. Время, которое я начинаю, это Местное время. Я на самом деле ищут преобразование в Zulu Time, которое, как я понимаю, больше не включает смещение вообще? –

+0

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

+0

Рад помочь. Кроме того, обратите внимание, что вы, вероятно, можете немного упростить свои функции. Если вы используете полный формат ISO8601 (с разделителем 'T'), здесь есть такие свойства, как' LocalDateTimePattern.GeneralIsoPattern'. Кроме того, если вы планируете форматировать без смещения или 'Z', вы можете повторно использовать один и тот же экземпляр' LocalDateTimePattern' для форматирования синтаксического разбора * и * вместо вызова 'ToString'. Кроме того, вы можете отказаться от шага «InUTC» и напрямую форматировать мгновенный, поскольку он уже является внутренним UTC. –