2009-11-10 3 views
5

내가 SQL에서 데이터를 읽고이 유사한 방식으로, 클라이언트 응용 프로그램에 WCF로 보낼 것입니다 응용 프로그램이 있습니다 : DataTime.DataTime.DataTime.DataTime.Value를 기본값으로 DateTimeKind.Utc로 채우는 방법?

SqlDataAdapter da = new SqlDataAdapter(cmd) 
DataSet ds = new DataSet(); 
da.Fill(ds); 
return ds; 

모든 날짜/시간이 UTC로 데이터베이스에 저장됩니다. 내가 알아 차린 점은 응용 프로그램을 실행하는 컴퓨터의 시계가 비뚤어지면 클라이언트가받은 날짜/시간도 비뚤어 질 수 있다는 것입니다. DateTime 타입이 명시되지 않은 종류 인 경우, WCF는이를 내부적으로 현지 시간으로 표시하고 그 자체로 전송하므로 응용 프로그램과 클라이언트 사이의 시간 차이로 인해 날짜/시간이 이동하게됩니다.

데이터 집합을 가져 와서 날짜/시간 필드를 수정할 때 데이터 세트를 통과 할 수 있지만 데이터 형식을 채우기 위해 더 나은 방법을 생각할 수 있으므로 모든 DateTime 필드는 자동으로 DateTimeKind.Utc가됩니다.()?

답변

15

SQL Server 2008을 사용하는 경우 SQL의 datetime 대신 SQL datetimeoffset 데이터 형식을 사용하는 것이 "적절한"솔루션입니다. datetimeoffset은 SQL 2008에 새로 추가 된 표준 시간대 형식의 날짜/시간 형식이며 ADO.NET에서 CLR System.DateTimeOffset 형식으로 변환됩니다.이 형식은 항상 UTC와 관련이 있습니다. 이에 대한 자세한 내용은 blog post입니다. first few search results on MSDN for DateTimeOffset은 추가 배경 정보를 제공합니다.

SQL 스키마를 변경할 수없는 경우 ADO.NET에는이 상황에 맞게 사용자 지정 속성이 있습니다. DataColumn.DateTimeMode은 데이터 집합이 serialize 될 때 로컬 시간대를 추가할지 (기본값 : DateTimeMode=DataSetDateTime.UnspecifiedLocal) 또는 직렬화시에 타임 존 정보가 추가되어 있지 않은가 (DateTimeMode=DataSetDateTime.Unspecified). 당신은 후자를 원해.

MSDN 문서를 읽는 것이 정확하다면 DataSet이 채워진 후 DataColumn에 대해 DateTimeMode=DataSetDateTime.Unspecified을 설정해야합니다. 이렇게하면 시간대없이 열을 직렬화해야합니다.

실제로 적합한 경우 (또는 위의 방법이 작동하지 않는 경우) 사전에 DataTable을 만들고 해당 열의 DateTimeMode=DataSetDateTime.UtcFill- 행 앞에 설정하면됩니다. 그런 다음 UTC로 날짜를 보냅니다.

+0

"Set DataTimeDesc = DataSetDateTime.Unspecified DataSet이 채워진 후 해당 DataColumn에 대해"완벽하게 작동합니다. 감사! – galets

+0

시원하고 기꺼이 도와주세요. –

+0

JSON 형식의 DateTime 값으로 보낸 오프셋을 제거하려면'DateTimeMode = DataSetDateTime.Utc'를 설정하십시오. – Suncat2000

관련 문제