22

約4年前、このMSDNの記事に従って、.Net1.1およびASMXWebサービス(バックエンドとしてSQL 2000サーバーを使用)で.Netクライアントを構築するためのDateTimeの使用に関するベストプラクティスを確認しました。DateTimeで発生したシリアル化の問題と、さまざまなタイムゾーンのサーバーで行ったテスト作業を今でも覚えています。

私の質問は次のとおりです。特に、タイムゾーン対応情報を格納するための新しい日時タイプが追加された、WCFやSQLServer2008などのいくつかの新しいテクノロジに関する同様のベストプラクティスドキュメントはありますか。

これが環境です:

  1. 太平洋標準時のSQLServer2008。
  2. 別のタイムゾーンのWebサービスレイヤー。
  3. クライアントは、異なるタイムゾーンで.Net2.0または.Net3.5を使用している可能性があります。簡単にできる場合は、すべてのユーザーに.Net3.5へのアップグレードを強制できます。:)

各レイヤーで使用されるデータ型に関する適切な提案/ベストプラクティスはありますか?

4

6 に答える 6

19

これを行う最善の方法は、常にオブジェクトを UTC として渡し、クライアントで現地時間に変換することだと思います。そうすることで、すべてのクライアントに共通の基準点ができます。

UTC に変換するには、DateTime オブジェクトで ToUniversalTime を呼び出します。次に、クライアントで ToLocalTime を呼び出して、現在のタイム ゾーンで取得します。

于 2008-09-15T18:14:18.043 に答える
12

大きな問題の 1 つは、WCF シリアル化が xs:Date をサポートしていないことです。これは大きな問題です。必要なのは日付だけであり、タイム ゾーンを気にする必要はありません。次の接続の問題では、いくつかの問題について説明しています: http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215

クライアントとサーバーの両方で .NET 3.5 を使用している場合、日付部分だけでなく特定の時点を明確に表現する場合は、DateTimeOffset クラスを使用できます。または、相互運用性のために、常に日付/時刻の値を UTC として渡します。

于 2008-09-16T20:00:22.413 に答える
4

UTC/GMT は、分散環境では一貫しています。

重要なことの 1 つは、DateTime プロパティにデータベースからの値を設定した後で、datetimeKind を指定することです。

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

MSDN を参照

于 2008-09-16T07:53:31.770 に答える
2

Web サービス レイヤーとクライアント レイヤーが .NET DateTime 型を使用している限り、次のようなタイムゾーン情報を含む SOAP 標準のローカル日付/時刻として適切にシリアル化および逆シリアル化する必要があります。

2008-09-15T13:14:36.9502109-05:00

タイムゾーン自体を確実に知る必要がある場合 (つまり、上記は東部標準時または中央夏時間である可能性があります)、それらの部分をそのように公開する独自のデータ型を作成する必要があります。

[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>
于 2008-09-15T18:34:59.240 に答える
1

DateTime データ型を保持し、常に GMT として保存するだけで幸運でした。各レイヤーで、GMT 値をレイヤーのローカル値に調整します。

于 2008-09-15T18:21:13.267 に答える