2013-08-14 1 views
2

У меня есть строка, которую я знаю, является Eastern Standard Time:Преобразовать Eastern Standard Time Строку в формате UTC DateTime с использованием портативных библиотек классов

"8/14/2013 5:51am" 

Я хочу, чтобы преобразовать это в UTC DateTime в моей портативной библиотеке классов, принимая летнее время. Я обнаружил, что Portable Class Library не имеет следующего метода:

TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 

Возможно ли это сделать в портативной библиотеке классов? Если нет, как это сделать в обычной библиотеке классов, учитывая, что в строке нет информации о часовом поясе?

+0

Существует время новообращенного метода МОВ, пытались ли вы, что – V4Vendetta

+0

@ V4Vendetta, проблема в OP является то, что местное время GMT, время интереса EST, и желаемое время UTC. PCL, кажется, только предоставляет доступные методы, предполагающие, что время находится в местном времени, и OP ищет способ сказать: «8/14/2013 5:51 утра» - это не местное время, а какой-то другой часовой пояс. –

ответ

4

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

К счастью, Noda Time имеет портативную версию, но вам нужно будет использовать имя зоны IANA, а не имя зоны Windows. Дополнительную информацию см. В разделе timezone tag wiki. Также убедитесь, что вы читали о limitations of NodaTime as a PCL.

using NodaTime; 
using NodaTime.Text; 

LocalDateTimePattern pattern = LocalDateTimePattern 
           .CreateWithInvariantCulture("M/dd/yyyy h:mmtt"); 
LocalDateTime ldt = pattern.Parse("8/14/2013 5:51am").Value; 

DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"]; 
ZonedDateTime zdt = tz.AtLeniently(ldt); 
Instant instant = zdt.ToInstant(); 

Debug.WriteLine(instant.ToString()); // 2013-08-14T09:51:00Z (UTC) 

// if you need it as a DateTime 
DateTime utc = instant.ToDateTimeUtc(); 
+0

Это похоже на работу. –

+1

Рад, что это работает для вас. Кроме того, обязательно прочитайте [в документах] (http://nodatime.org/1.1.x/api/html/M_NodaTime_DateTimeZone_AtLeniently.htm) о значении '.AtLeniently'. Вместо этого вы могли бы использовать '.AtStrictly', или вы могли бы предоставить свою собственную стратегию. –

2

PCL предоставляет структуру TimeZoneInfo, но не включает нужную функцию, а это значит, что вам, вероятно, придется написать код преобразования часового пояса самостоятельно. Это не должно быть слишком плохо, если вы всегда будете конвертировать только один часовой пояс в другой, но если ваши часовые пояса будут распространяться по всему миру, это будет непросто.

Сначала я собирался рекомендовать Jon Skeet's, et. . Аль, Noda Time, но они перечисляют значительный limitation и такое же ограничение вы обнаружили:

В .NET API предназначена для портативных библиотек классов является более ограниченным , чем полная версия рабочего стола. В настоящее время это обеспечивает относительно небольшое количество ошибок для Noda Time с одним существенным исключением: TimeZoneInfo. Хотя мы можем обнаружить эквивалент TZDB 10 местного часового пояса через TimeZoneInfo.StandardName вместо его идентификатора (как мы это делали ), мы не можем получать произвольные временные зоны по ID, а также не можем просить правила настройки для определенного часового пояса.

Если Noda Time не может сделать, тогда я думаю, что вы останетесь с его вычислением вручную.

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