我有一个问题,我自己解决,但需要一些确认词,我是否100%正确的想法,只是因为没有任何文件我发现证明自己是正确的。
我的服务器目前处于DST时间,CRM UI也显示1小时,然后数据存储在db中。没关系。
当我使用插件计算和存储日期时,在我的插件更新操作完成后,CRM平台会从我保存的数据中扣除1小时。我已经读过,当我们通过SDK相关日期时间进行一些操作时,CRM会按日期时间存储日期时间。是时候在DST的时候,平台也会涉及到当时扣除1小时?
作为一项决议,我已经评论了我的扣除1小时的行,让CRM现在就做了。
我是否理解我的理解,或者如果某人可以提供任何文档网址,那将是可观的。
答案 0 :(得分:4)
每当您使用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,它将按预期工作。
这使得您希望将日期作为日期存储的日期非常困难(生日是谁?),您可能需要更深入地考虑它。
答案 1 :(得分:0)
我自己已经弄清楚了。该日期中有组件,用于探讨它的日期时间。它可以是Utc,Local或Unspecified。
当您通过代码将任何日期传递给CRM属性时。确保日期时间类型为Utc,否则CRM服务内部操作会将其转换为Utc。
就我而言,我一直坚持这一点,因为当我从CRM读取日期时,我不得不在那个日期开始办公。例如我需要将 03/02/2014 12:00 设置为 03/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)
希望能帮助。