首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确保存数据?

如何正确保存数据?
EN

Stack Overflow用户
提问于 2011-11-09 18:05:11
回答 6查看 20.6K关注 0票数 26

我正在尝试保存日期(使用C#官方驱动):

代码语言:javascript
复制
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}

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-09 20:24:00

c#驱动默认情况下(无需额外设置)将本地日期作为协调时日期保存到数据库中(日期-时区偏移),但不执行任何操作(因此,协调时日期)。

因此,当您从数据库加载datetime时,您将在2小时内收到diff (时区偏移量)。有两种方法可以告诉mongodb驱动程序在反序列化过程中将c#日期转换为本地时区日期:

1.通过特定日期字段的属性:

代码语言:javascript
复制
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

2.通过所有日期时间字段的全局设置(默认为UtcInstance):

代码语言:javascript
复制
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

一旦您将执行#1或#2,您将看到本地日期。

更新:

#2在最新的驱动程序版本中已过时,因此请使用以下代码:

代码语言:javascript
复制
BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

更新:

#2再次改变:

代码语言:javascript
复制
BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
票数 45
EN

Stack Overflow用户

发布于 2011-11-09 18:31:06

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-11-17 09:16:09

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

代码语言:javascript
复制
val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8063323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档