在 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 中处理时区
使用代码配置日期和时间列的行为和格式