日付を保存しようとしています(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}になります。
欲しい日付だけを保存する方法は?
デフォルトでは(追加設定なしで)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);
タイムゾーンの問題が発生しています。日付オブジェクトがUTC以外のタイムゾーン(外観では2時間進んでいる)にあるか、デフォルトのタイムゾーンがUTC以外に設定されている可能性があります。ドライバーは、データベースに保存する前に、日付を適切なタイムゾーンに変換します。
逆(データベースからUTC日付を取得)は元のタイムゾーンに変換する必要があるため、通常はこれに気付かないでしょう。使用しているドライバーに問題があるか、C#で正しく実行するためにもう少しコードが必要な場合があります。
日付を文字列として保存すると、日付の範囲クエリが無効になるため、通常はお勧めできません。
MongoはすべてをUTCで保存します。日時がUTCの場合、これは役に立ちます
val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);
2.2.4.26が再び変更されました:
BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
私の場合、[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
は機能しません。
私がしたことは以下です
DateTime _someDateProperty ;
public DateTime SomeDateProperty
{
get { return _someDateProperty ; }
set
{
_someDateProperty = new DateTime(value.Ticks, DateTimeKind.Local);
}
}