使用 API 或 C# 程序时日期偏移一天

Date is off by one day when using the API or C# program

我正在尝试使用 Postman 或我拥有的 C# 程序向 CRM 发送日期。传递的日期是“2019-09-15”,但在 CRM 中显示时是“2019-09-14”。

在 Postman 中,我在 PATCH 正文中发送:

{
  "org_paymentreceived": "2019-09-15"
}

在 C# 程序中,我发送这个:

{
  "org_paymentreceived": Convert.ToDateTime(payment)
}

在这两种情况下,很明显 2019-09-15 已通过,但在 CRM 中仍显示为 2019-09-14

Dynamics CRM 始终在后端 Datetime 字段中存储为 UTC,因此无论何时创建 Datetime 属性,请确保设置行为,如您希望的独立时区或默认情况下的用户本地行为。

否则,在用于 Web api 交互的特定用户帐户的个人选项下设置正确的时区设置,与您的用户群相同。

传递给 CRM 的本地日期时间将转换为 UTC 并存储。然后进行检索逆向工程。

CRM UI 将在该日期时间字段中呈现当前登录用户基于时区的值。而任何 SDK、web api 调用都会从数据库中获取 UTC 值。

基于@Arun Vinoth 的回答...

以下是我在 C# 中处理将 UTC 传递到 D365 的方法:

public class XrmDate
{
    public DateTime Now() => DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc);        
}

用法:

myEntity["myDate"] = new XrmDate().Now();

您还可以定义日期时间属性的行为,以在创建或更新字段时自动转换时间或不转换时间。

您可以通过简单地在字段级别禁用它来禁用 "Dynamics automatically calculates dates for you based on your local timezone"。因此,如果它对您的实例不重要(例如,如果您只在一个时区工作),则无需将其转换为 UTC 时间。

我在通过网络从 CRM 检索日期时间时遇到了问题 api。幸运的是格式化值具有正确的日期。