日期和时间列的行为和格式
在 Microsoft Dataverse 中,您可以指定如何向用户显示日期和时间值以及如何根据时区调整它们。
日期和时间列有两个可用选项。
- 行为:是否根据时区调整值。
- 格式:是否显示值的时间部分。
行为
Dataverse 以 UTC 时区存储所有日期和时间值。 当您的应用显示值或处理用户输入的值时,Dataverse 和模型驱动应用可以使用这些行为选项根据用户的时区进行调整。
- 用户当地时间:根据用户的时区调整值。 这是默认行为。 可以将此值更改为其他行为。
- 时区无关:无时区转换。
- 仅限日期:无时区转换。 与时区无关不同,不存储时间部分。
用户的时区在个人选项中设置,而不是在 Windows、Android、iOS 或 macOS 的系统时区中设置。 但是,系统时区可能会影响使用 JavaScript 日期的客户端脚本。
Format
所有日期和时间列都有时间部分,除非其行为是仅限日期。 格式确定是否显示值的时间部分。
- 日期和时间:显示值的日期和时间。
- 仅限日期:仅显示值的日期部分。
备注
如果格式为仅限日期,用户仍可以更改时间部分。 例如,通过 Web API 调用或使用具有时间部分的控件。 这与仅限日期的行为不同,该行为根本不存储时间部分。
使用情况准则
当不需要时区信息(例如酒店入住登记时间)时,使用时区无关行为。 进行此选择后,所有时区的用户将看到相同的日期和时间值。
当不需要有关一天的时间和时区的信息(例如生日或纪念日)时,使用仅限日期行为。 进行此选择后,所有时区的用户将看到完全相同的日期值。
采用仅限日期格式的时区无关行为实际上与仅限日期行为相同。 如果您不确定将来是否需要时间部分,请使用前者。
重要
避免仅日期格式和用户当地时间行为。 不同时区的用户可能会看到不同的日期,这在大多数情况下是不希望出现的。 当用户在模型驱动应用中设置日期时,时间部分将自动设置为他们所在时区的午夜。 这可能会导致其他用户提前或推迟一天看到该日期。
示例
显示值
Dataverse 存储 2023-10-15T07:30:00Z
(或者对于仅限日期行为,存储 2023-10-15
)。 时区 UTC-8 中的用户在模型驱动应用中或通过 Web API 请求查看格式化值:
行为 | Format | 显示值 |
---|---|---|
用户当地时间 | 日期和时间 | 2023 年 10 月 14 日下午 11:30 |
用户当地时间 | 仅限日期 | 2023 年 10 月 14 日 |
时区无关 | 日期和时间 | 2023 年 10 月 15 日上午 7:30 |
时区无关 | 仅限日期 | 2023 年 10 月 15 日 |
仅限日期 | - | 2023 年 10 月 15 日 |
在应用中输入值
时区 UTC-8 中的用户在模型驱动应用中输入 October 14th, 2023, 11:30 pm
。 该值在 Dataverse 中另存为:
行为 | Format | Dataverse 中保存的值 |
---|---|---|
用户当地时间 | 日期和时间 | 2023-10-15T07:30:00Z |
用户当地时间 | 仅限日期 | 2023-10-15T07:30:00Z |
时区无关 | 日期和时间 | 2023-10-14T23:30:00Z |
时区无关 | 仅限日期 | 2023-10-14T23:30:00Z |
仅限日期 | - | 2023-10-14 |
如果用户只输入日期 October 14th, 2023
,假设时间部分为凌晨 12:00。
行为 | Format | Dataverse 中保存的值 |
---|---|---|
用户当地时间 | 仅限日期 | 2023-10-14T08:00:00Z |
时区无关 | 仅限日期 | 2023-10-14T00:00:00Z |
仅限日期 | - | 2023-10-14 |
在应用中输入无效值
不同客户端处理无效输入的方式不同。 例如,在太平洋时区,夏令时从 2023 年 3 月 12 日凌晨 2:00 开始,将时间向前移动一小时至凌晨 3:00。 当天凌晨 2:00 到凌晨 3:00 之间的时间不存在。 当用户尝试输入该时间范围中的值时,应用可能会执行以下操作之一:
- 更改为上一个或下一个有效时间。
- 还原为最后一个已知值。
- 显示错误消息。
- 不要在时间选取器中显示凌晨 2:00 到凌晨 3:00 之间的时间,这样用户在一开始就无法选择它们。
同样,不同客户端处理重复时间范围的方式也不同。 例如,在太平洋时区,夏令时从 2023 年 11 月 5 日凌晨 2:00 结束,将时间向后移动一小时至凌晨 1:00。 当天凌晨 1:00 到凌晨 2:00 之间的时间重复两次。 像凌晨 1:30 这样的时间可以指任何一个时区。 如果需要明确地显示或输入该范围中的时间,最好暂时切换到不使用夏令时的时区。
使用 Web API 获取原始值
Dataverse 存储 2023-10-15T07:30:00Z
(或者对于仅限日期行为,存储 2023-10-15
)。 所有时区的用户都通过 Web API 请求获取以下值:
行为 | Format | 原始值 |
---|---|---|
用户当地时间 | 日期和时间 | 2023-10-15T07:30:00Z |
用户当地时间 | 仅限日期 | 2023-10-15T07:30:00Z |
时区无关 | 日期和时间 | 2023-10-15T07:30:00Z |
时区无关 | 仅限日期 | 2023-10-15T07:30:00Z |
仅限日期 | - | 2023-10-15 |
使用客户端 API 获取值
时区 UTC-8 中的用户在模型驱动应用中输入 October 14th, 2023, 11:30 pm
。 客户端 API 函数(例如 formContext.getAttribute(<column name>).getValue()
)返回应用了时区调整的值:
行为 | Format | JavaScript dateValue.toUTCString() |
---|---|---|
用户当地时间 | 日期和时间 | 2023-10-15 07:30 (UTC) |
用户当地时间 | 仅限日期 | 2023-10-15 07:30 (UTC) |
对于时区无关行为,JavaScript 日期值采用浏览器的时区:
行为 | Format | JavaScript dateValue.toString() |
---|---|---|
时区无关 | 日期和时间 | 2023-10-14 23:30(浏览器时区) |
时区无关 | 仅限日期 | 2023-10-14 23:30(浏览器时区) |
JavaScript 日期值始终具有时间组件。 因此,仅限日期行为的时间组件为凌晨 12:00:
行为 | Format | JavaScript dateValue.toString() |
---|---|---|
仅限日期 | - | 2023-10-15 00:00(浏览器时区) |
备注
JavaScript 日期值受浏览器的时区(来自设备操作系统设置)的影响。
对于用户当地时间行为,客户端 API 结果应解释为 UTC 值。 使用 Date.getUTCDate()
、Date.getUTCHours()
等处理它。 若要获取用户看到的时间,请应用 getTimeZoneOffsetMinutes。 不要使用 Date.getDate()
、Date.getHours()
等,因为它们将显示采用浏览器时区的值。
对于时区无关和仅限日期行为,客户端 API 结果应解释为采用浏览器时区的值。 使用 Date.getDate()
、Date.getHours()
等处理它。 不要使用 Date.getUTCDate()
、Date.getUTCHours()
等,因为不需要针对任何时区进行调整。
更改用户当地时间行为
除非托管解决方案发布商阻止此行为,否则您可以将现有自定义日期列的行为从用户当地时间更改为仅限日期或时区无关。 这是一次性的更改。
更改列行为将影响列行为更改后添加或修改的列值。 数据库中的现有列值仍然是 UTC 时区格式。 若要将现有列值的行为从 UTC 更改为仅限日期,可能需要开发人员的帮助转换数据库中现有日期和时间值的行为。
警告
在更改现有日期和时间列的行为之前,应查看列的所有依赖项,如业务规则、工作流、计算列或汇总列,确保行为更改没有导致出现问题。 在更改日期和时间列的行为后,打开依赖于更改的列的每个业务规则、工作流、计算列和汇总列,查看信息,然后保存,以确保使用最新的日期和时间列的行为和值。
在解决方案导入期间更改行为
当使用用户当地时间行为导入包含“日期”列的解决方案时,可以将行为更改为仅限日期或时区无关。
备注
如果您是发布商,可以仅更改现有托管仅限日期或日期和时间列的行为。 为了对这些字段进行更改,必须对添加了仅限日期或日期和时间列的解决方案进行升级。 详细信息:升级或更新解决方案
阻止更改行为
如果您在托管解决方案中分发自定义日期列,阻止使用您的解决方案的用户通过将 CanChangeDateTimeBehavior 托管属性设置为 False 来更改行为。 详细信息:设置列的托管属性
“仅限日期”行为不支持的日期和时间查询运算符
以下与日期和时间相关的查询运算符对仅限日期行为无效。 当这些运算符之一用于查询时,会引发无效运算符异常错误。
- X 分钟以前
- X 小时以前
- 过去 X 小时
- 接下来 X 小时
另请参见
解决模型驱动应用中的日期和时间问题
创建和编辑列
定义计算列以自动化手动计算
列托管属性
托管属性
博客:在 Dataverse 中处理时区
使用代码配置日期和时间列的行为和格式