2013-05-28 2 views
0

Я пытаюсь получить время UTC из зонирования datetime с использованием шаблона LocalDateTime в NodaTime, используя приведенный ниже код.Zoned dateTime to UTC Time - LocalDateTimePattern throws exception

public string getUtcTimeFromZonedTime(string dateTimeString, string timeZoneID, 
             string dateTimePattern, bool isDateTime) 
{ 

    if (string.IsNullOrEmpty(dateTimePattern)) 
    { 
     if (isDateTime) 
     { 
      dateTimePattern = "M/dd/yyyy HH:mm:ss tt"; 
     } 
     else 
     { 
      dateTimePattern = "M/dd/yyyy"; 
     } 
    } 

    var pattern = LocalDateTimePattern.CreateWithInvariantCulture(dateTimePattern); 

    var parseResult = pattern.Parse(dateTimeString); 
    if (!parseResult.Success) 
    { 
     // throw an exception or whatever you want to do 
    } 

    var localDateTime = parseResult.Value; 

    var timeZone = DateTimeZoneProviders.Tzdb[timeZoneID]; 

    // TODO: Consider how you want to handle ambiguous or "skipped" local date/time 
    // values. For example, you might want InZoneStrictly, or provide your own custom 
    // handler to InZone. 
    var zonedDateTime = localDateTime.InZoneLeniently(timeZone); 

    return zonedDateTime.ToDateTimeUtc().ToString(); 
} 

я получаю исключение при разборе во нижеуказанным scenarios- 1) Если шаблон, как "MM/DD/YYYY HH: MM: SS ТТ" и строка DateTime что-то вроде «5/28/2013 1: 02: ss PM « 2) Если шаблон похож на« MM-dd-yyyy HH: mm: ss tt », а строка DateTime - это что-то вроде« 5/28/2013 1: 02: ss PM »

Для первого случая он будет работать, если я изменю свой рисунок на «M/dd/yyyy HH: mm: ss tt», но в итоге я потеряю начальный ноль. Второй случай будет работать, если я изменю шаблон на «MM/dd/yyyy HH: mm: ss tt»

Есть ли альтернативный способ получения значений UTC или я делаю что-то неправильно здесь.

ответ

0

1) Если шаблон, как "ММ/дд/гггг чч: мм: сс сс" и строки DateTime что-то вроде "5/28/2013 1: 02: сс PM"

Да, потому что вы указали, что вы дадите ему двузначный час, и вы указали только одну цифру. Обратите внимание, что если вы используете обозначение AM/PM, вы, вероятно, хотите h, а не H.

2) Если шаблон, как "ММ-дд-гггг чч: мм: сс тт" и строка DateTime что-то вроде "5/28/2013 1: 02: сс PM"

Да, потому что вы указали, что хотите выделить - как разделитель, но в тексте вы используете /.

Я подозреваю, что вы хотите:

dateTimePattern = "M/dd/yyyy h:mm:ss tt"; 

Обратите внимание, что это не имеет ничего общего с преобразованием в UTC - это просто синтаксический к LocalDateTime, что вызывает вас проблемы.

+0

Да, я исправил свой предыдущий образец, и в настоящее время я использую шаблон «M/dd/yyyy h: mm: ss tt». Я также хотел знать, есть ли другой способ получить UTC из строки datetime, используя NodaTime. – Lakshman

+0

Разбор строки ZonedDateTime с использованием LocalDateTatTatPattern.CreateWithInvariantCulture (dateTimePattern) позволит нам получить значение DateTime во время сервера? – Lakshman

+1

@Lakshman: Нет, это даст вам «LocalDateTime». Чтобы преобразовать это в 'ZonedDateTime', вам нужно указать часовой пояс. Или с 1.2 вы сможете разобрать прямо на 'ZonedDateTime', либо используя зону в значении шаблона, либо с идентификатором зоны в самом тексте. –