문제

약 4년 전에 나는 이것을 따랐다. MSDN 기사 .Net 1.1 및 ASMX 웹 서비스(SQL 2000 서버를 백엔드로 사용)에서 .Net 클라이언트를 구축하기 위한 DateTime 사용 모범 사례입니다.DateTime에서 겪었던 직렬화 문제와 다른 시간대에 있는 서버에 소요된 테스트 노력을 아직도 기억합니다.

내 질문은 다음과 같습니다.특히 시간대 인식 정보를 저장하기 위한 새로운 날짜/시간 유형이 추가된 WCF 및 SQL Server 2008과 같은 일부 신기술에 대한 유사한 모범 사례 문서가 있습니까?

환경은 다음과 같습니다.

  1. 태평양 표준시의 SQL Server 2008.
  2. 다른 시간대의 웹 서비스 레이어.
  3. 클라이언트는 서로 다른 시간대에서 .Net 2.0 또는 .Net 3.5를 사용할 수 있습니다.가능하다면 모든 사람이 .Net 3.5로 업그레이드하도록 강제할 수 있습니다.:)

각 레이어에서 사용할 데이터 유형에 대한 좋은 제안/모범 사례가 있습니까?

도움이 되었습니까?

해결책

이를 수행하는 가장 좋은 방법은 항상 개체를 UTC로 전달하고 클라이언트의 현지 시간으로 변환하는 것입니다.이렇게 하면 모든 클라이언트에 대한 공통 참조 지점이 있습니다.

UTC로 변환하려면 DateTime 개체에서 ToUniversalTime을 호출합니다.그런 다음 클라이언트에서 ToLocalTime을 호출하여 현재 시간대로 가져옵니다.

다른 팁

한 가지 큰 문제는 WCF 직렬화가 xs:Date를 지원하지 않는다는 것입니다.원하는 것은 데이트뿐이므로 시간대에 대해 걱정할 필요가 없으므로 이는 큰 문제입니다.다음 연결 문제는 몇 가지 문제를 설명합니다. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215

특정 시점을 명확하게 표현하려는 경우, 즉날짜 부분뿐만 아니라 클라이언트와 서버 모두에 .NET 3.5가 있는 경우 DateTimeOffset 클래스를 사용할 수 있습니다.또는 상호 운용성을 위해 항상 날짜/시간 값을 UTC로 전달하세요.

UTC/GMT는 분산 환경에서 일관됩니다.

한 가지 중요한 점은 DateTime 속성을 데이터베이스의 값으로 채운 후 datetimeKind를 지정하는 것입니다.

dateTimeValueUtcKind = DateTime.SpecifyKind(dateTimeValue, DateTimeKind.Utc);

MSDN 참조

웹 서비스 계층과 클라이언트 계층이 .NET DateTime 유형을 사용하는 한 다음과 같은 시간대 정보가 포함된 SOAP 표준 로컬 날짜/시간으로 적절하게 직렬화 및 역직렬화되어야 합니다.

09/15/2008 20:14:36

절대적으로 그렇다면 시간대 자체를 확실히 알아야 합니다(예:위의 내용은 동부 표준시 또는 중부 일광 절약 시간일 수 있습니다. 다음과 같이 해당 부분을 노출하는 고유한 데이터 유형을 만들어야 합니다.

[Serializable]
public sealed class MyDateTime
{
    public MyDateTime()
    {
        this.Now = DateTime.Now;
        this.IsDaylightSavingTime = this.Now.IsDaylightSavingTime();
        this.TimeZone = this.IsDaylightSavingTime
            ? System.TimeZone.CurrentTimeZone.DaylightName
            : System.TimeZone.CurrentTimeZone.StandardName;
    }

    public DateTime Now
    {
        get;

        set;
    }

    public string TimeZone
    {
        get;

        set;
    }

    public bool IsDaylightSavingTime
    {
        get;

        set;
    }
}

그러면 귀하의 응답은 다음과 같습니다.

<Now>2008-09-15T13:34:08.0039447-05:00</Now>
<TimeZone>Central Daylight Time</TimeZone>
<IsDaylightSavingTime>true</IsDaylightSavingTime>

저는 DateTime 데이터 유형을 유지하고 항상 GMT로 저장하는 행운을 누렸습니다.각 레이어에서 GMT 값을 레이어의 로컬 값으로 조정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top