我有一个问题,我自己解决了,但需要一些确认的话来确认我的想法是否 100% 正确,只是因为我没有找到任何文档来证明自己是正确的。
我的服务器目前处于夏令时,CRM UI 也显示 1 小时,然后数据存储在数据库中。
当我使用插件计算和存储日期时,在我的插件更新操作完成后,CRM 平台会从我保存的数据中扣除 1 小时。我读到,当我们通过SDK相关的日期时间进行一些操作时,CRM会按原样存储日期时间。是不是当时间在夏令时,平台也会参与到那时扣除 1 小时?
作为解决方案,我已经注释掉了我扣除 1 小时并让 CRM 现在做的行。
我的理解是否正确,或者如果有人可以提供任何文档 URL,那将是可观的。
每当在 SDK 中工作时,都会检索 DateTimes 并将其存储为 UTC。 CRM网络平台会将UTC时间转换为用户的时间。 您不需要进行任何时间转换,只需使用 UTC。
假设您的本地时间是 UTC -1(使用 DST,因为 UTC 不遵守它)。 因此,如果 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,它将按预期工作。
这使得您希望存储为日期的日期时间非常困难(生日有人吗?),您可能需要更深入地考虑它。
我自己也想通了。 该日期包含用于探索其处于哪种日期时间的组件。 它可以是 Utc、本地或未指定。
当您通过代码将任何日期传递给 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 时间中使用 InDate,我正在创建新的日期对象,因此它丢失了从 UTC 到本地的 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)
希望有帮助。