2016-11-03 14 views
0

私は構造体DateTimeZoneを作成します。UTC時間を取るように設定しています。現地時間を取るようにしました。Date Time異なる時間帯を扱う構造体

DateTimeZone time = DateTime.Now;//time will equal the UTC time 
    DateTime localTime= time; // local time will equal the Local time 

構造体

public struct DateTimeZone 
{ 
    private DateTime dateTime; 

// public DateTimeZone Value { get; } 

    public static implicit operator DateTimeZone(DateTime value) 
    { 
     return new DateTimeZone() { dateTime = value.ToUniversalTime() }; 
    } 

    public static implicit operator DateTime(DateTimeZone value) 
    { 
     return value.dateTime.ToLocalTime(); 
    } 
} 

私の質問:構造体よりも、これを実装する最も簡単な方法はありますか? この構造体には例外があります。なぜなら、DBにエンティティフレームワークを保存する理由は です。したがって、構造体を使用するたびにマッピングを行う必要があります。どのように簡潔にマッピングできるのですか?

+2

'DateTime'は、タイムゾーン_awareness_です。正直なところ、何をしようとしているのかはっきりしていませんが、DateTime用のより優れたAPIである[Nodatime](http://nodatime.org/)を使用する方がよいでしょう。 –

+0

ありがとうございます、私は時間帯に問題がありますので、DBにutc時間を保存するためにdatetimeが必要です&UIを表示するときに現地時間を得るために、私は質問を修正します – Jala

答えて

1

いくつかのことを:

  • はあなたの命名には注意してください。 DateTimeZoneのような名前のオブジェクトには、1)タイムゾーン情報のみ、または2)日付と時間とタイムゾーンのいずれかが含まれていると予想されます。あなたのオブジェクトはDateTimeの周りのカプセル化ラッパーだけなので、これらのものはありません。

  • 暗黙的な操作は悪い可能性があります。特に暗黙の操作は、操作している値の意味を変更した場合には邪魔になります。 実際にはあなたがやっていることを知っていない限り、日付/時刻でそれらを使用することはお勧めしません。このオブジェクトのどのユーザーにとっても、実際にどのような価値があったのかはすぐに分かりません。

  • ToUniversalTimeToLocalTime機能は、あなたが作業しているDateTimeオブジェクトの.Kindプロパティに割り当てられDateTimeKindに基づいて自分の行動を変えます。 DateTimeは常にローカルで、DateTimeZoneは常にUTCですが、この考え方ではDateTimeKindというAPIを作成しているようです。

  • コメントに記載されているように、あなたは非常にしっかりした、よく考え抜かれたAPIであるNoda Timeを調べるかもしれません。野田時間では、Instantタイプは常にUTCを表し、LocalDateTimeタイプは常にタイムゾーンのない日時を表します。タイムゾーンはDateTimeZone(あなたの名前との競合を参照)で表され、ZonedDateTimeタイプはこれらを組み合わせて、インスタントインタイム情報、ローカルタイム情報、および関連するタイムゾーンの両方を持っています。

  • あなたはEntity Frameworkについて言及しました。残念ながら、EFはカスタムオブジェクトまたはNoda Timeと直接動作しません。シンプルな型変換を行うことはできません。これは要求されていますが、まだ実装されていません。 You can follow the work item for it here。あなたが使用できる回避策は、 "buddy properties"、as described hereです。彼らは楽しいものではありませんが、彼らは働きます。ほとんど。

  • DateTimeを使用して、必要に応じてToUniversalTimeまたはToLocalTimeのようなメソッドを手動で呼び出すことが妥当な場合があります。データベースからロードするときにEFでDateTimeKindを正しく設定する場合は、this answerを参照してください。

  • ToUniversalTimeToLocalTimeは、コードが実行されているコンピュータのローカルタイムゾーンで動作することに注意してください。これは、デスクトップアプリケーションやモバイルアプリケーションでは問題ありませんが、サーバーのタイムゾーンを変更するとデータに大きな影響を与える可能性があるため、Webアプリケーションではほとんど望ましくありません。代わりに、組み込みのTimeZoneInfoクラスを使用して、またはNoda TimeのDateTimeZoneクラスを使用して、指定されたタイムゾーンで作業することを検討してください。あなたのための

追加読書:

1

たぶん、あなたは、このいずれかを試してみてください:

public struct DateTimeZone 
{ 
    public DateTime DateTime; 

    public static explicit operator DateTimeZone(DateTime dt) 
    { 
     return new DateTimeZone { DateTime = dt.ToUniversalTime() }; 
    } 
} 

var time = (DateTimeZone)DateTime.Now; 
var localTime = time.DateTime; 
関連する問題