【问题标题】:CRM 2011, Date in plugin and DSTCRM 2011,插件中的日期和 DST
【发布时间】:2014-05-11 19:39:56
【问题描述】:

我有一个问题是我自己解决的,但我需要一些确认词来确认我的想法是否 100% 正确,因为我没有找到任何文件来证明自己是正确的。

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

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

作为一项决议,我已将我的扣除 1 小时并让 CRM 现在执行的行注释掉。

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

【问题讨论】:

    标签: c# datetime dynamics-crm-2011 dst


    【解决方案1】:

    只要您在 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,它会按预期工作。

    这使得您希望将日期时间存储为日期非常困难(生日有人吗?),您可能需要更深入地考虑它。

    【讨论】:

    • 当我在实体日期时间属性中提供任何日期(假设硬编码日期)并执行 SDK 更新操作时,计算在这里不是问题。我在插件中传递给该属性的日期减去 1 小时并存储在 db 中。这是奇怪的行为,因为我相信您在插件中传递实体属性的任何日期。它应该按原样存储。尽管经过更多测试,我发现有时它会扣除,而有时则不会。仍有疑问。
    【解决方案2】:

    我自己想通了。该日期中有一个组件,用于探索它所处的日期时间类型。它可以是 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 时间有 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)
    

    希望有所帮助。

    【讨论】:

    • 有人似乎很难过,但这个修复完全解决了我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多