2012-03-20 9 views
0

DateTimeの使用量が多すぎるかなり複雑なシステム(正確なタイプに依存するヘルパーと拡張機能を持つ1k以上の場所)があるとします。今からUTCの日付を保存する必要があると決めたとします。Nhibernateを使用してC#DateTimeをdatetimeoffsetにマッピングします。

私の最初のアイデアは、すべてのDateTimeタイプをDateTimeOffsetに置き換えていましたが、これはさまざまなコンテキストで頻繁に使用されているため、簡単な作業ではありません。

質問は、残りのシステムで使用されているタイプを変更することなく、NHiberanteのマッピングを変更することができますか?それとも、大きなリファクタリングが唯一の方法ですか?

+0

NHibernateはどのようなオフセットを適用するのか知っていますか?歴史的な日付の読み込みはどのように扱われますか? UTCを採用しようとするならば、コードベース全体に渡る必要があります。 –

+0

説明:**•2000年1月1日以降のティック数を示す62ビットの数値 •DateTimeKind(Unspecified、Local、Utc)**を示す2ビットの列挙型。あなたはいつでも変換を行うことができます –

答えて

1

あなたはNHibernateの流暢自動マッピングを使用する場合は、これがために私の慣例だ:私はUtcDateTimeTypeを持続することを好む、それがローカルに変換するよりも、

public class UtcDateTimeConvention : IPropertyConvention, IPropertyConventionAcceptance 
    { 
     public void Apply(IPropertyInstance instance) 
     { 
      instance.CustomType<UtcDateTimeType>(); 
     } 

     public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
     { 
      criteria.Expect(x => 
       x.Property.PropertyType.Equals(typeof(DateTime)) || 
       x.Property.PropertyType.Equals(typeof(DateTime?))); 
     } 
    } 

 public static DateTime ToUserTimeZone(this DateTime utcDateTime, TimeZoneInfo currentTimeZone) 
     { 
      if (utcDateTime.Kind != DateTimeKind.Utc) 
      { 
       throw new ArgumentException("utcDateTime.Kind != DateTimeKind.Utc", "utcDateTime"); 
      } 

      return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, currentTimeZone); 
     } 

     public static DateTime? ToUserTimeZone(this DateTime? utcDateTime, TimeZoneInfo currentTimeZone) 
     { 
      if (utcDateTime.HasValue) 
      { 
       return ToUserTimeZone(utcDateTime.Value, currentTimeZone); 
      } 

      return null; 
     } 
+0

UtcDateTimeTypeは正確にはDateTimeOffset型ではありません。キャスト可能かもしれません。 –

+1

実際には、永続化された値を取得してToLocalTime()を実行すると例外が発生します –

関連する問題