CRM 2011,插件中的日期和夏令时

我有一个问题,我自己解决,但需要一些确认的话,我是否100%正确的想法,只是因为没有任何文件,我发现certificate自己是正确的。

我的服务器目前处于DST时间,CRM UI也显示1小时,然后数据存储在db中。 没关系。

当我使用插件计算和存储日期时,在我的插件更新操作完成后,CRM平台从我保存的数据中扣除1小时。 我已经读过,当我们通过SDK相关日期时间进行一些操作时,CRM会按日期时间存储日期时间。 是时候在DST的时候,平台也会涉及到当时扣除1小时?

作为一个决议,我已经评论了我的扣除1小时的行,让CRM现在就做了。

我是否理解我的理解,或者如果有人可以提供任何文档URL,那将是可观的。

每当您使用SDK时,都会检索DateTime并将其存储为UTC。 CRM网络平台将UTC时间转换为用户的时间。 您不应该只使用UTC进行任何转换。

假设您的本地时间是UTC -1(由于UTC没有观察到DST,因此使用DST)。 因此,如果UTC是14:00,那么您当地的时间是13:00。 让我们假设您的插件将在明天填充当前时间的实体上的日期属性。 如果您的代码如下所示:

entity.new_SomeDate = DateTime.Now.AddDays(1); service.Update(entity); 

假设DateTime.Now是13:00,它将在数据库中存储13:00(就像它是UTC一样)。 然后,当您从CRM网站查看时间值时,由于您是UTC – 1,它将显示12:00,即使您想要13:00。

现在,如果您的代码如下所示:

 entity.new_SomeDate = DateTime.UtcNow.AddDays(1); service.Update(entity); 

假设DateTime.Now是13:00,它将在数据库中存储14:00,因为DateTime.UtcNow是14:00。 然后,当您从CRM网站查看时间值时,由于您是UTC – 1,它将显示13:00,因为它将采用UTC值 – 1。

现在,如果您的代码如下所示:

 entity.new_SomeDate = entity.new_UserEnteredDateFromCrm.AddDays(1); service.Update(entity); 

new_UserEnteredDateFromCrm已经从用户的时区转换为UTC,它将按预期工作。

这使得你更喜欢将DateTimes存储为Dates非常困难(生日是谁?),你可能需要更深入地思考它。

我自己弄清楚了。 该日期中有组件,用于探索它的日期时间。它可以是Utc,Local或Unspecified。

当您通过代码将任何日期传递给CRM属性时。 确保日期时间类型为Utc,否则CRM服务内部操作会将其转换为Utc。

在我的情况下,我坚持这一点,因为当我从CRM读取日期时,我不得不在那个日期开始办公。 例如,我需要制作03/02/2014 12:0003/02/2014 8:30,以使传入日期与办公室开始时间一致。 我做的操作就像,

 DateTime InDate = Case.CreatedOn.Value; DateTime Dt = new DateTime(InDate.Year,InDate.Month,InDate.Day,8,30,0) 

在Utc Time中使用InDate,我正在创建新的日期对象,因此它从Utc到Local丢失了DateTime种类(在DST中它表示1小时起)

为了避免,总是将DateTime类型设置为与新对象的日期一样。 例如,上述操作可以替代地完成。

 DateTime InDate = Case.CreatedOn.Value; DateTime Dt = new DateTime(InDate.Year,InDate.Month,InDate.Day,8,30,0) Dt = DateTime.SpecifyKind(Dt,DateTimeKind.Utc) 

希望有帮助。