2013-05-28 2 views
0

아래 코드를 사용하여 NodaTime의 LocalDateTime 패턴을 사용하여 존 (zone) datetime에서 UTC 시간을 얻으려고합니다.Zoned dateTime to UTC Time - LocalDateTimePattern 예외가 발생합니다.

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의 TT"와 같은 경우와 날짜 시간 문자열은 "같은 것입니다 28분의 5/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"로 변경하면 작동하지만 맨 앞의 0은 사라집니다. 패턴을 "MM/dd/yyyy HH : mm : ss tt"로 변경하면 두 번째 경우가 작동합니다.

UTC 값을 가져 오는 다른 방법이 있습니까? 아니면 여기에서 잘못된 것이 있습니다.

답변

0

1) 패턴이 "MM/DD/YYYY의 HH : MM : SS의 TT"와 같은 경우 ": 02 : SS의 PM 2013년 5월 28일 1"

과 날짜 시간 문자열 같은 것이있다

예, 두 자리 시간을 지정하고 한 자리 만 입력 했으므로 지정했기 때문입니다. AM/PM 지정자를 사용하는 경우 H이 아닌 h이 필요합니다.

2) 패턴과 같은 경우 "MM-DD-YYYY의 HH : MM : SS의 TT"와 날짜 시간 문자열은 같은 것입니다 "2013년 5월 28일 1 : 02 : SS의 PM"

예, 구분자로 -을 지정했지만 텍스트에 /을 사용하도록 지정했기 때문에 가능합니다.

나는 당신이 원하는 의심이가 UTC로 변환 함께 할 수 없다

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

하는 것으로 - 그것은 당신에게 문제를 일으키는 LocalDateTime 단지 구문 분석입니다.

+0

예 Jon, 이전 패턴을 수정했으며 현재 "M/dd/yyyy h : mm : ss tt"패턴을 사용하고 있습니다. 또한 NodaTime을 사용하여 datetime 문자열에서 UTC를 얻는 다른 방법이 있는지 알고 싶었습니다. – Lakshman

+0

LocalDateTimePattern.CreateWithInvariantCulture (dateTimePattern)을 사용하여 ZonedDateTime 문자열을 구문 분석하면 서버 시간에 DateTime 값을 얻을 수 있습니까? – Lakshman

+1

@Lakshman : 아니요, 'LocalDateTime'을 제공합니다. 이것을 'ZonedDateTime'으로 변환하려면 시간대를 지정해야합니다. 또는 1.2를 사용하면 템플릿 값의 영역을 사용하거나 텍스트 자체의 영역 식별자를 사용하여 'ZonedDateTime'을 직접 파싱 할 수 있습니다. –