2010-02-04 3 views
2

datetime 값이있는 레코드를받는 WCF 서비스가 있고 Entity Framework 3.5, SP1을 사용하여 Azure SQL 데이터베이스에 저장합니다. 로컬로 실행, 레코드가 데이터베이스에 저장받을 모든 그러나 내 IIS 호스팅이 다른 시간대에WCF to Entity Framework에서 내 datetime을 현지 시간으로 변환합니다. 어떻게 중지합니까?

물론이다. 사이트를 업로드하고 동일한 서비스 (동일한 연결 문자열을 사용하여 Azure SQL 데이터베이스에 연결)를 호출해도 레코드는 여전히 저장되지만 시간은 5 시간 뒤로 이동했습니다.

나는 Fiddler를 체크하여 나가는 데이터를 보았고, 그것은 현지 시간이었다. 나는 Azure 호스팅 내에서 동일한 서비스를 사용했고, 그것도 잘 저장되었습니다. Linq2SQL과 함께 저장되는 동일한 호스트의 다른 WCF 서비스에 동일한 데이터가 전달되어 저장이 잘됩니다.

유일한 차이점은 Entity Framework입니다. 시간대 정보 (GMT)가 datetime과 함께 전송되므로 동부 해안 시간의 서버가이를 받으면 로컬 시간으로 변환합니다. 5 몇 시간 일찍.

순간적으로 (13:48) 5 시간 더지기 때문에 (08:48) 데이터베이스에서 저장하고 싶지 않으므로 저장하고 싶습니다. 13:48. 나는 그것을하도록 요청, 그래서 이것은 아마도 정말 간단하고, 다른 사람들이 답을 알고 있지만, 나는 조금 의아해 오전 내가

를 쿼리 의미가있다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 정말 고마워.

많은 감사

토비

+0

트릭을 수행하는 것 같은 해결 방법이있다. 원래 datetime을 정의 할 때 클라이언트, Utc. 서버의 내 도우미 클래스는 또한 Utc로 지정합니다. 그런 식으로 올바른 날짜가 저장됩니다 GMT는 UTC이므로 이것은 우연히 만난 것일 수 있습니다. 이것은 여름철로 이동할 때 3 개월 만에 작동하지 않을 수도 있습니다. "ToLocaltime()"으로 변환 하시겠습니까? 그때 일하니? 흠, dunno 더 이상 아이디어를 저장하지 않고 시간을 절약 하시겠습니까? – TobyEvans

+0

아니요, ToLocalTime() 또는 ToUniversalTime()을 사용하지 마십시오. 실행중인 시스템의 시간대를 사용하여 표준 시간대 보정을 적용합니다. 그게 당신이 풀려고했던 문제이지 반복은 아닙니다. 항상 UTC로 변환하면 절대 시간이므로 일광 절약 시간제로 조정되지 않습니다. .NET 3.5 이상을 사용하는 경우 TimeZoneInfo.ConvertTimeFromUtc() 및 ConvertTimeToUtc()를 TimeZoneInfo 개체와 함께 사용하여 변환을 명시해야합니다. 나는 그것들을 사용했고 의도 한대로 작동합니다. – Suncat2000

답변

2

당신은 지정되지 않음에 클라이언트 측 값에 DateTimeKind을 변경 시도 할 수 있습니다. 그런 식으로 WCF와 Entity Framework는 변환에 대해 영리하게 노력할 충분한 정보가 없습니다.

DateTime.SpecifyKind
DateTimeKind


에 최대에 따라이 작업을하고 질문에 댓글 ... 첫째

, 무엇을하기를 원하십니까하려고하지 - 당신이에 저장된 값을 원하는가 데이터베이스가 클라이언트의 시간대 - 귀하의 경우 영국 시간 - 또는 UTC로 저장 되길 원하십니까? 내 경험에 비추어 가장 좋은 해결책은 UTC로 저장하는 것입니다. 그렇지 않으면 다른 시간대에 여러 클라이언트가있는 경우 정말 혼란 스러울 것입니다.

UTC로 저장하려고한다고 가정하면 네트워크를 통해 전달하기 전에 클라이언트 측에서 UTC로 변환해야합니다 (DateTime.ToUniversalTime). 그런 다음 서버가 UTC로 인식해야합니다. 이 작업을 자동으로 수행하십시오. 그러나 확실하게 받기 위해 SetKind를 호출 한 후이를 호출 할 수 있습니다. Entity Framework 이어야하며 데이터베이스에이 내용을 변경하지 않고 그대로 저장해야합니다.

이제 트릭은 데이터를 검색 할 때 클라이언트로 돌아 오는 시간이 UTC임을 알 수 있습니다. 따라서 영국 시간이 더 이상 UTC와 일치하지 않을 경우 잘못 표시됩니다. 따라서 사용자에게 표시하기 전에 서버에서받은 모든 값에 DateTime.ToLocalTime으로 전화하십시오.

는 적어도 그게 내가 걸릴 접근 입니다.

(오, 동료 영국 개발자로서 나는 이런 종류의 일을 할 때 내 클라이언트 PC의 시간을 영국 시간으로 설정하는 것이 매우 유용하다는 것을 안다. 그렇지 않으면 당신이 선택하지 않을 버그를 소개 할 것이다. 우리가 BST로 전환 할 때까지 계속. 내 경험으로 이것은 당신이 살고 난 후에 일어나는 경향이있다.)

+0

건배 - 이제 그걸 드리겠습니다 ... – TobyEvans

+0

nope - 아무런 차이가 없으므로 설정을 사용하십시오. DateTimeKind를 Unspecified, UTC 및 Local로 설정합니다. 항상 로컬 시간으로 저장했습니다. 내가 캐시 된 버전이라고 생각한 코드를 사용하고 있는지 확인하기 위해 날짜 변환을 도우미 메서드로 래핑하여 이전 날짜의 새 날짜를 만든 다음 밀리 초를 원하는지 변경했는지 여부도 변경했습니다. : 감사하지만 대답은 불행히도 ... – TobyEvans

+0

안녕하세요. 잘 설명해줍니다. 나는 날짜를 (일/월/년을 대표하여) 생각해야 할 것입니다. 그들은 동일하게 유지해야하며, BST 기간 중 한 달 전일/월로 미루는 것을 원하지 않습니다. 건배 – TobyEvans

관련 문제