web-dev-qa-db-ja.com

日付を正しく保存する方法は?

日付を保存しようとしています(C#公式ドライバーを使用):

val = DateTime.Parse(value).Date; //Here date is {11/11/2011 12:00:00 AM}
var update = Update.Set("Date", val);
...

データベースから日付を選択すると、値は{11/10/2011 10:00:00 PM}になります。

欲しい日付だけを保存する方法は?

25
1gn1ter

デフォルトでは(追加設定なしで)c#ドライバーは、ローカル日付をutc日付としてデータベースに保存します(日付-タイムゾーンオフセット)が、アクションなしで読み戻します(つまり、utc日付)。

このため、データベースから日時をロードすると、2時間で差分が返されます(タイムゾーンオフセット)。逆シリアル化中に、mongodb c#ドライバーにUTC日付をローカルタイムゾーン日付に変換する方法は2つあります。

1.特定の日付フィールドの属性を介して:

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

2.すべての日時フィールドのグローバル設定を介して(デフォルトはUtcInstance):

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

#1または#2を実行すると、現地の日付が表示されます。

更新:


#2は最新のドライバーバージョンでは廃止されているため、代わりに以下のコードを使用してください。

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

更新:


#2が再び変更されました:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
43
Andrew Orsich

タイムゾーンの問題が発生しています。日付オブジェクトがUTC以外のタイムゾーン(外観では2時間進んでいる)にあるか、デフォルトのタイムゾーンがUTC以外に設定されている可能性があります。ドライバーは、データベースに保存する前に、日付を適切なタイムゾーンに変換します。

逆(データベースからUTC日付を取得)は元のタイムゾーンに変換する必要があるため、通常はこれに気付かないでしょう。使用しているドライバーに問題があるか、C#で正しく実行するためにもう少しコードが必要な場合があります。

日付を文字列として保存すると、日付の範囲クエリが無効になるため、通常はお勧めできません。

2
Remon van Vliet

MongoはすべてをUTCで保存します。日時がUTCの場合、これは役に立ちます

val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);
1
Brijesh Mishra

2.2.4.26が再び変更されました:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
1
yongfa365

私の場合、[BsonDateTimeOptions(Kind = DateTimeKind.Local)]は機能しません。

私がしたことは以下です

    DateTime _someDateProperty ;
    public DateTime SomeDateProperty 
    {
        get { return _someDateProperty ; }
        set
        {
            _someDateProperty = new DateTime(value.Ticks, DateTimeKind.Local);
        }
    }
0
Nithin Chandran