如何妥善保存日期?

时间:2011-11-09 10:05:11

标签: mongodb mongodb-.net-driver

我正在尝试保存日期(使用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}

如何只保存我想要的日期?

6 个答案:

答案 0 :(得分:42)

默认情况下c#驱动程序(没有额外设置)将本地日期作为utc日期保存到数据库中(日期 - 时区偏移)但是没有任何操作就读回(因此,utc日期)。

因此,当您从数据库加载日期时间时,您会在2小时内收到差异(您的时区偏移)。在反序列化过程中,有两种方法可以说mongodb c#driver将utc日期转换为本地时区日期:

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);

答案 1 :(得分:2)

您遇到了时区问题。您的日期对象可能位于UTC以外的时区(其外观提前2小时),或者您的默认时区设置为UTC以外的其他时区。在将日期存储到数据库之前,驱动程序会将日期转换为适当的时区。

通常你不会注意到这一点,因为反向(从数据库中检索UTC日期)应该将其转换回原始时区。您正在使用的驱动程序可能存在问题,或者C#可能需要更多代码才能使其正确。

将日期存储为字符串通常不是一个好主意,因为它会禁用日期范围查询。

答案 2 :(得分:1)

Mongo以UTC格式存储所有内容,如果您的日期时间是UTC,这将有助于

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

答案 3 :(得分:1)

2.2.4.26再次改变:

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

答案 4 :(得分:0)

在我的情况下,[BsonDateTimeOptions(Kind = DateTimeKind.Local)]无法正常工作。

我的工作在下面

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

答案 5 :(得分:-1)

Mongodb以“UTC DateTime”格式存储的日期值,该格式包括日期和时间。时间。所以你不能单独在现场存储日期。相反,您可以在从mongo检索后,在应用程序代码中单独获取日期部分。

喜欢在c#

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

datevalue.ToShortDateString()