在Dynamics CRM中如何通过API协调用户本地输入日期与UTC存储日期
Dynamics CRM 日期字段读取原始录入值解决方案
无需客户配合的临时方案(仅读权限即可实现)
- 直接读取Entity对象的FormattedValues属性:通过OrganizationService查询返回的实体对象自带
FormattedValues集合,该集合存储的是对应字段在CRM UI上的显示值,默认和当前API调用用户的区域、时区设置匹配。你只需要将调用CRM接口的服务账号时区调整为客户CRM实例的组织默认时区,即可拿到和用户录入时完全一致的原始日期字面量。
示例代码(C#):
注意:该方案返回的是字符串格式的日期,如果你需要做日期计算、排序等操作,需要自行解析为DateTime类型。// 按需查询商机实体的自定义日期字段 ColumnSet columnSet = new ColumnSet("custom_projectstartdate", "custom_projectenddate"); Entity opportunity = orgService.Retrieve("opportunity", 商机记录GUID, columnSet); // 读取格式化后的原始日期字符串 if (opportunity.FormattedValues.ContainsKey("custom_projectstartdate")) { string projectStartDateInput = opportunity.FormattedValues["custom_projectstartdate"]; } if (opportunity.FormattedValues.ContainsKey("custom_projectenddate")) { string projectEndDateInput = opportunity.FormattedValues["custom_projectenddate"]; } - 如果你使用FetchXML进行批量查询,可以在请求头中指定返回格式化值,也能拿到相同的结果,无需额外做时区转换逻辑。
需要客户配合的永久解决方案(适配全场景)
如果你的业务逻辑需要直接使用DateTime类型的原始日期,避免字符串解析的兼容问题,可以让客户调整两个自定义日期字段的配置,操作步骤可以直接提供给客户管理员:
- 进入Dynamics CRM后台,依次打开高级设置 > 自定义 > 自定义系统,找到商机(opportunity)实体的字段列表
- 分别编辑
custom_projectstartdate和custom_projectenddate两个字段的属性 - 将字段的行为选项从默认的「用户当地时间」修改为「日期仅(无时区转换)」
- 保存修改并发布实体自定义项即可
配置调整后,用户在UI选择日期时CRM不会做任何时区转换,直接存储用户输入的字面日期,你通过OrganizationService直接读取字段的DateTime属性就是原始录入值,不需要做额外处理。
内容的提问来源于stack exchange,提问作者Stephan G
相关产品推荐
相关产品推荐

