2012-05-10 3 views
2

저는 인터넷 검색을 해왔지만 지금은 일종의 해결책을 찾고 있지만 운이별로 없습니다.LINQ의 시간대 변환

나는 하루 동안의 데이터에 해당하는 레코드 집합을 얻으려고합니다. 1 일분의 데이터는 4 : 00 : 00EST-3 : 59 : 59EST입니다. 내 결과 집합을 사용자에게 표시 할 때 사용자의 현지 시간 (내 경우 CST)에 결과를 표시하고 싶습니다. 다음을 제외하고는 일반적으로 그다지 어려운 일은 아닙니다 :

  • 데이터베이스의 타임 스탬프는 모두 GMT입니다.
  • 데이터베이스의 현지 시간은 EST입니다.
  • 나의 현지 시간은 CST입니다.

데이터베이스의 시간은 EST이지만 레코드는 GMT로 저장되므로 GETDATE()를 호출하고 조정할 수 없습니다.

LINQ/Entity Framework 4.1 Code-First를 C#에서 사용하고 있으며 데이터베이스에서 Sybase를 사용하고 있습니다.

위의 정보에서 주어진 GMT 데이터를 사용자의 현지 시간으로 변환하려면 어떻게해야합니까?

+3

UTC입니까? 나는 GMT가 DST를 가지고 있다고 확신한다. –

+0

@AustinSalonen 감사합니다. 편집했습니다. – Kittoes0124

답변

4

나는 이것에 대해 지나치게 overthink하고 솔루션은 실제로 매우 간단 밝혀졌다. 다음 링크는 매우 도움이되었다 :

DateTime utcBeginDateTime = DateTime.UtcNow.Date.AddHours(8); 
DateTime utcEndDateTime = utcBeginDateTime.AddDays(1); 

나에게 2012년 5월 10일 8 UTC 시간을 제공 :

http://iamacamera.org/default.aspx?section=develop/code%20snippets&id=76 http://msdn.microsoft.com/en-us/library/ms973825.aspx

나는 다음과 같은 변수를 설정하여 데이터베이스를 쿼리하기 전에 : 00 : 00 ~ 05/11/2012 8:00:00 AM. EST이를 변환하는 것은 오히려 간단하다

TimeZoneInfo estZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcBeginDateTime, estZone); 

이 나에게 2012년 5월 10일 오전 4시 0분 0초EST 시간을 제공 할 것입니다.


내 LINQ 쿼리이 사용 :

var timeQuery = from p in db.cl_contact_event 
       where p.time_of_contact >= utcBeginDateTime && p.time_of_contact < utcEndDateTime 
       select new 
       { 
        time = TimeZoneInfo.ConvertTimeFromUtc(p.time_of_contact.Value, estZone), 
        id = p.id 
       }; 

그것은 당신이 .AsEnumerable를 사용하여 클라이언트에 쿼리를 실행하지 않는 TimeZoneInfo.ConvertTimeFromUtc() 아마 작동하지 않습니다 가치가 아무것도() 없습니다. 사이베이스 버전에서는 제대로 작동하지 않는다는 것을 알고 있습니다. 따라서 필자는 최대한 많은 결과를 필터링하고 .AsEnumerable()을 호출 한 다음 표준 시간대 변환/다른 논리를 수행해야합니다.

+0

나는 비슷한 문제를 가지고 있었고 이런 유형의 해결책이 나를 위해 일했습니다. 감사. – ozziwald

+0

좋은 해결책. AsEnumerable은 클라이언트 측에서 수행한다는 것을 의미합니다. UTC 변환은'where' 또는'order by'에서 원한다면 까다로워집니다. – nawfal