How to save date properly?

限于喜欢 提交于 2019-11-28 06:49:58
Andrew Orsich

c# driver by default (without extra settings) saving local dates as utc date into database (date - time zone offset) but reading back without any action (so, utc date).

Because of this when you loading datetime from database you receive diff in 2 hours (your timezone offset). There are two approaches how to say to mongodb c# driver convert utc dates to local timezone dates during deserialization:

1.through the attributes for particular date field:

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

2.through global settings for all datetime fields (default is UtcInstance):

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

Once you will do #1 or #2 you will see local date.

Update:


#2 is obsolete in latest driver version so use code below instead:

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

Update:


#2 has changed again:

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

You're running into a timezone issue. Your date object is probably in a timezone other than UTC (2 hours ahead by the looks of it) or your default timezone is set to something other than UTC. The driver will convert the date to the appropriate timezone before storing it in the database.

Normally you wouldn't notice this since the reverse (retrieving the UTC date from the database) should convert it back to the original timezone. There might be an issue with the driver you're using or C# might require a bit more code to get it right.

Storing dates as strings is usually not a good idea since it disables range queries on dates.

Mongo stores everything in UTC, in case your date time is UTC this will help

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

2.2.4.26 has changed again:

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

In my case [BsonDateTimeOptions(Kind = DateTimeKind.Local)] doesn't worked.

What i did is below

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

Mongodb Date value stored in "UTC DateTime" format which comprises of both date & time. so you just cannot store date alone in the field. Instead you can get the date part alone in your application code after retrieving from mongo.

like in c#

datevalue.ToString("MM/dd/yyyy");

or

datevalue.ToShortDateString() 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!