D365 – 日期和时间字段

前言

本文记录Dynamics CRM关于日期和时间字段的使用及其基础知识。

基本概念

Dataverse 以 UTC 时区存储所有日期和时间值。 当应用显示值或处理用户输入的值时,Dataverse 和模型驱动应用可以使用 “格式” 选项根据用户的时区进行调整。

新建“日期和时间”字段

在实体新建 日期和时间(Date and Time) 字段时,可以选择以下以下格式:仅日期或日期和时间。

格式 描述
仅日期 “仅日期” 显示的日期和时间值。 时间值在系统中存储为 12:00 AM (00:00:00)
日期和时间 日期和时间值

选择日期和时间字段的 “格式”

在实体新建 日期和时间(Date and Time) 字段时,在 “高级选项” 中可以选择以下 “时区调整”。

此外,“时区调整” 的可选选项又根据 “格式” 变化,具体如下:

# 时区调整 描述
1 用户当地时间 默认值。根据用户的时区调整值
2 时区无关 显示无时区转换的值
3 仅日期 无时区转换。 与时区无关不同,不存储时间部分
(时间值在系统中存储为 12:00 AM (00:00:00))
# 时区调整 描述
1 用户当地时间 默认值。根据用户的时区调整值
2 时区无关 显示无时区转换的值

P.S: 新建后的 “日期和时间” 字段,“格式” 和 “时区调整” 仍然可以在解决方案中修改。

“格式”和“时区调整”可以再更改吗?

已创建 的 “日期和时间” 字段,它的 “格式” 和 “时区调整” 是否还可以修改?经验证,结果如下:

“格式” & “时区调整” “格式” “时区调整”
仅日期 - 用户当地时间 可改 可改
仅日期 - 时区无关 可改 不可改
仅日期 - 仅日期 不可改 不可改
日期和时间 - 用户当地时间 可改 可改
日期和时间 - 时区无关 可改 不可改

“时区调整”该如何选?

“时区调整” 选项 描述
时区无关 当不需要 “时区” 信息时,例如酒店入住登记时间、发票付款时间等,使用该选项,选择该选项后,所有时区的用户将看到相同的日期和时间值
仅限日期 不关注一天的 “时间” 或 “时区” 时,例如生日或纪念日等,使用该选项,选择该选项后,所有时区的用户将看到完全相同的日期值。

小实验

我将在 Invoice 实体新添如下 5 个 “日期和时间” 字段,然后对它们进行赋值,接着到 DB 上看看存储情况。

(1)新建字段

5 个“日期和时间”字段如下:

# 名称 字段名称 格式 时区调整
1 D - User Local gdh_d_userlocal 仅日期 用户当地时间
2 D - TZ independent gdh_d_tz_independent 仅日期 时区无关
3 D - D gdh_d_d 仅日期 仅日期
4 DT - User Local gdh_dt_userlocal 日期和时间 用户当地时间
5 DT - TZ independent gdh_dt_tz_independent 日期和时间 时区无关

5 个 “日期和时间” 字段

(2)在表单中填写“日期和时间”字段

(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi 时区下,对字段进行赋值:

字段 填写值
D - User Local 2025-03-10
D - TZ independent 2025-03-12
D - D 2025-03-14
DT - User Local 2025-03-10 14:30
DT - TZ independent 2025-03-24 09:30

对日期和时间字段进行赋值

(3)在数据库查看数据

在数据库查看数据

结果如下:

字段 填写值 数据库存储的值
D - User Local 2025-03-10 2025-03-09 16:00:00.000
D - TZ independent 2025-03-12 2025-03-12 00:00:00.000
D - D 2025-03-14 2025-03-14 00:00:00.000
DT - User Local 2025-03-10 14:30 2025-03-10 06:30:00.000
DT - TZ independent 2025-03-24 09:30 2025-03-24 09:30:00.000

为什么 D - User Local 在 DB 中存储的是 2025-03-09 16:00:00.000 ? 我在 (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi 时区下,对 D - User Local 进行赋值,填写的时间是 2025-03-10 但是在数据库中,时间被存储为 UTC 时区,在东八区到 UTC 之间有 8 小时的时差 所以在本地填写的 2025-03-10 日期被转换到 UTC 时区时,就变成了 2025-03-09 16:00:00.000

DT - User Local 同理。

SQL
SELECT gdh_d_userlocal AS 'D - User Local',
       gdh_d_tz_independent AS 'D - TZ independent',
       gdh_d_d AS 'D - D',
       gdh_dt_userlocal AS 'DT - User Local',
       gdh_dt_tz_independent AS 'DT - TZ independent'
FROM   gdh_invoice
WHERE  gdh_no = 'SAS-00000001';
点击展开查看更多

(4)使用 Test06 查看数据

注:用户 Test06 使用的的时区是 (GMT+04:00) Baku

使用 Test06 查看数据

为什么 用户 Test06 在表单上看到的 D - User Local 是 2025-03-10 10:30:00.000 ?

D - User Local 在数据库中存储的时间是 2025-03-10 06:30:00.000 (UTC 时区),

当这个时间转换到用户 Test06 所在的时区:“(GMT+04:00) Baku”,

时间就变成了 2025-03-10 10:30:00.000( UTC + 4),

所以用户 Test06 在表单上看到的 D - User Local 是 2025-03-10 10:30:00.000

(4)使用 Client API 获取

a. 获取 D - User LocalDT - User Local

名称 字段名称 格式 时区调整 GMT+08:00 时区下填写
D - User Local gdh_d_userlocal 仅日期 用户当地时间 2025-03-10
DT - User Local gdh_dt_userlocal 日期和时间 用户当地时间 2025-03-10 14:30
JS
// 'Sun, 09 Mar 2025 16:00:00 GMT'
Xrm.Page.getAttribute("gdh_d_userlocal").getValue().toUTCString(); 

// 'Sun, 09 Mar 2025 16:00:00 GMT'
Xrm.Page.getAttribute("gdh_d_userlocal").getValue().toUTCString(); 
点击展开查看更多

b.对于 “时区无关”,返回的是浏览器的时区

获取 D-TZ independentDT-TZ independent

名称 字段名称 格式 时区调整
D-TZ independent gdh_d_tz_independent 仅日期 时区无关
DT-TZ independent gdh_dt_tz_independent 日期和时间 时区无关
JS
// 'Wed Mar 12 2025 00:00:00 GMT+0800 (中国标准时间)'
Xrm.Page.getAttribute("gdh_d_tz_independent").getValue().toString(); 

// 'Mon Mar 24 2025 09:30:00 GMT+0800 (中国标准时间)'
Xrm.Page.getAttribute("gdh_dt_tz_independent").getValue().toString(); 
点击展开查看更多

(5)使用 Web API 获取

(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi 时区下,对字段进行赋值,并通过 Web API 获取:

字段 填写值 数据库存储的值 通过 Web API 获取得出
D-User Local 2025-03-10 2025-03-09 16:00:00.000 2025-03-09T16:00:00Z
D-TZ independent 2025-03-12 2025-03-12 00:00:00.000 2025-03-12T00:00:00Z
D-D 2025-03-14 2025-03-14 00:00:00.000 2025-03-14
DT-User Local 2025-03-10 14:30 2025-03-10 06:30:00.000 2025-03-10T06:30:00Z
DT-TZ independent 2025-03-24 09:30 2025-03-24 09:30:00.000 2025-03-24T09:30:00Z

可以看出,通过 Web API 获取的原始值,和数据库存储的一样。

JAVASCRIPT
var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/gdh_invoices(98F83878-1E35-EF11-8409-0017FA0671FA)?$select=gdh_d_d,gdh_d_tz_independent,gdh_d_userlocal,gdh_dt_tz_independent,gdh_dt_userlocal", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var result = JSON.parse(this.response);
            var gdh_d_d = result["gdh_d_d"];
            var gdh_d_tz_independent = result["gdh_d_tz_independent"];
            var gdh_d_userlocal = result["gdh_d_userlocal"];
            var gdh_dt_tz_independent = result["gdh_dt_tz_independent"];
            var gdh_dt_userlocal = result["gdh_dt_userlocal"];
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();
点击展开查看更多

查询运算符不支持?

“仅限日期” 类型的日期和时间字段,不允许使用下面的查询运算符,当这些运算符用于查询时,会引发无效运算符异常错误。

例如:对 “D-D” 列进行筛选,筛选条件如下:

<condition attribute="gdh_d_d" operator="last-x-hours" value="5"/>

对“D-D”列设置筛选条件

执行后会报错:2147779605The operator is not valid or it is not supported.

出现异常:2147779605The operator is not valid or it is not supported.

如何设置用户的时区?

右上角的设置按钮 –> 个性化设置 –> General Tab –> 选择时区

设置用户的时区

参考

  1. 使用 Power Apps 解决方案资源管理器创建和编辑 Microsoft Dataverse 的列
  2. Column Data types

版权声明

作者: Donghai

链接: https://mgrowup.com/posts/d365/date-time-fields/

许可证: CC BY-NC-SA 4.0

文章已根据知识共享署名-非商业性使用-相同方式共享4.0国际许可协议授权。请注明来源,仅非商业使用,并保持相同的许可协议。

评论

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键