在公式中使用日期、日期时间和时间值
日期使用了两种数据类型:日期和日期时间。数据类型时间不包括日期值,例如工作时间。处理日期时使用的大部分值都是日期数据类型,存储年、月和日。CreatedDate 等一些字段是日期时间字段,意味着它们不仅存储日期值,而且还存储时间值(以 GMT 存储,但以用户的时区显示)。当在记录详细信息页面查看时,日期、日期时间和时间字段以用户的区域设置格式化。时间值的精度以毫秒为单位。日期时间值的精度以秒为单位。
您可在日期、日期时间和时间值上使用加和减等运算符,以计算未来日期或两个日期或时间之间的已过去的时间。例如,如果您将一个日期减去另一个日期,由此得出的值将是两个初始值之差(天)(数字数据类型)。两个日期时间值之间的同一操作将返回十进制值,表示天、小时和分钟数之差。两个时间值的相同操作会返回毫秒。
例如,如果两个日期时间值之差是 5.52,这意味着两个值分隔 5 天、12 小时(1 天的 0.5)和 28 分钟(1 天的 0.02)。您还可以添加数字值到日期和日期时间。例如,操作 TODAY() + 3
将返回今天日期后的三天。
在整个示例中,使用了变量日期和日期时间以代替实际日期和日期时间字段或值。
today()、now() 和 timenow()
- TODAY() 函数以日期数据类别返回当前日、月和年。对于希望了解自上一天过去的天数、未来某些天数中的日期或仅仅希望显示当前日期的公式,本函数非常有用。
- NOW() 函数返回当前时刻的日期时间值。当关心当天的特定时间以及日期时,这将非常有用。
- TIMENOW() 函数会返回 GMT 的值,并表示不带日期的当前时间。如果您需要当前小时、分钟、秒或毫秒,使用此函数,而不是 NOW() 函数。此值对跟踪时间(例如轮班或经过时间)有用。
有关如何在日期值和日期时间值之间转换的详细信息,请参阅 在日期时间和日期之间转换
date()函数
DATE() 函数返回日期值,给定年、月和日。数字 Y/M/D 值和 YEAR()、MONTH() 和 DAY() 函数是 DATE() 的有效参数。例如,DATE( 2013, 6, 1 )
返回2013 年 6 月 1 日。同样,DATE( YEAR( TODAY() ), MONTH( TODAY() ) + 3, 1)
返回当年今天起三个月的第一天的日期值,假定该日期有效(例如,月份在 1 和 12 之间)。
如果输入的 Y/M/D 值导致无效的日期,DATE() 函数并不会报错,而是会返回一个可能错误的值,比如非闰年的DATE(2021,2,29)将返回2021-03-01,DATE(2021,121,29)将返回2031-01-29,因此错误检查是使用日期值的重要部分。您可在示例日期格式中阅读有关处理无效日期的方法。
在日期时间和日期之间转换
日期和日期时间是不可交换的数据类型,因此在日期和日期时间值之间执行操作时,您需要转换这些值,使它们具有相同的类型。一些函数(如 YEAR()
、MONTH()
和 DAY()
)还仅适用于日期值,因此必须首先转换日期时间值。
使用 DATEVALUE( datetime )
函数返回日期时间的日期值。例如,要从日期时间获取年,使用 YEAR( DATEVALUE( datetime ) )
。
您可以使用 DATETIMEVALUE( TEXT(date) )
函数将日期值按GMT时区转换为日期时间。时间将设置为格林威治标准时间 (GMT) ,然后显示时会按用户所有时区显示。对于北京时间,DATETIMEVALUE( TEXT(TODAY()) )
将返回当天的utc0点,Steedos界面上将显示为当天的上午8:00而不是当天的 00:00。有关详细信息,请参阅有关日期时间和时区的备注
在日期时间和时间之间转换
TIMEVALUE() 函数返回的时间数据类型值的格式为 24 小时制的“HH:MM:SS.MS”(hours:minutes:seconds.milliseconds)
数字 H/M/S/MS 值和 HOUR()、MINUTE()、SECOND() 和 MILLISECOND() 函数是 TIMEVALUE() 的有效参数。
使用 TIMEVALUE(text) 函数,把文本值、文本类型合并字段或表达式转换为时间类型。例如,使用 TIMEVALUE(LPAD(TEXT(HOUR(ClosedDate)), 2, "0") & ":" & LPAD(TEXT(MINUTE(ClosedDate)), 2, "0") & ":" & LPAD(TEXT(SECOND(ClosedDate)), 2, "0") & "." & LPAD(TEXT(MILLISECOND(ClosedDate)), 3, "0"))
从 ClosedDate 日期时间值中提取时间。
在日期和文本之间转换
如果希望将日期作为字符串一部分 包含,在 TEXT() 函数中包含日期值以转换为文本。例如,如果希望将今天的日期转换为文本,使用: "Today's date is " & TEXT( TODAY() )
这将以格式“YYYY-MM-DD”而不是取决于区域设置的格式返回日期。先从日期中提取日、月、年,然后按所需格式重新组合,即可更改公式。例如: "Today's date is " & TEXT( MONTH( date ) ) & "/" & TEXT( DAY( date ) ) & "/" & TEXT( YEAR( date ) )
您还可以将文本转换为日期,以便将字符串值与您的其他日期字段和公式一起使用。您将希望文本的格式为“YYYY-MM-DD”。使用本公式以返回日期值: DATEVALUE( "YYYY-MM-DD" )
在日期时间和文本之间转换
您可使用 TEXT() 函数在字符串包含日期时间值,但需要小心时区。例如,考虑本公式: "The current date and time is " & TEXT( NOW() )
在本公式中,NOW() 偏移到 GMT。通常,NOW() 将在查看时转换成用户的时区,但由于被转换为文本,因此转换不会发生。因此,如果您在 8 月 1 日北京时间 (GMT-10) 下午6点 执行本公式,结果是“The current date and time is 2021-08-01 10:00:00Z”。
当将日期时间转换为文本时,将在最后包含“Z”以表示 GMT。
要将字符串转换为日期时间值,使用 DATETIMEVALUE() 将以“YYYY-MM-DD HH:MM:SS”的格式传输字符串。本方法将返回 GMT 的日期时间值。
在时间和文本 之间转换
如果您想要将时间作为字符串的一部分包含,在 TEXT() 函数中封装时间值,以将其转换为文本。例如,如果您想要将当前时间返回为文本,使用: "The time is " & TEXT( TIMENOW() )
此函数会返回格式为“HH:MM:SS.MS”的时间。
您也可以将文本转换为时间数据类型,以便将字符串值与其他时间字段和公式一起使用。按 24 小时制将文本格式化为“HH:MM:SS.MS”。使用 TIMEVALUE() 函数: TIMEVALUE("17:30:45.125")
有关日期时间和时区的备注
日期和日期时间值以 GMT 存储。保存好记录后,字段值存储为 GMT时区下的值,然后在记录详细信息页面显示时以查看者的时区显示。不会因日期转换而造成问题,因为转换日期时间为日期会得到相同的日期值。
然而,当使用日期时间值时,转换始终以 GMT 而不是用户的时区完成。如果在两个日期时间字段之前比较不会有时区问题,因为这两个字段都在同一时区。然而,当计算中的一个值从文本或日期值转换为日期时间值时,结果将不同。
让我们假定北京用户在名为 Date_Time_c 的自定义日期时间字段输入 2020 年 8 月 2 日 9点的值。该值被存储为 2020-08-02 01:00:00Z,因为存在 GMT+8的时区差。在北京时间 8 月 2 日21:00,用户编辑记录时运行以下公式字段: Date_Time_c - NOW()
在计算中,NOW() 是 2020-08-02 13:00:00Z,然后从 2020-08-02 01:00:00Z 相减会返回 -0.5(-12 小时)的预期结果。
假定不使用 NOW(),公式将转换字符串“2020-08-02 21:00:00”为日期时间值: Date_Time_c - DATETIMEVALUE( "2020-08-02 21:00:00")
在这种情况下,DATETIMEVALUE( "2020-08-02 21:00:00")是 2020-08-02 21:00:00Z,最后运算结果会返回-0.8333333333333334(-20小时),与之前的-12小时不同。
假定当前时间还是北京时间2020年11月10日21点,即2020-11-10T13:00:00Z,把上面的NOW换为当天日期函数TODAY: TODAY() - DATEVALUE("2020-11-10T19:00:00Z")
运算结果为0,因为减号左右两侧都是北京时间11月10号,但是如果假定当前时间为北京时间2020年11月10日早上7点的话,因为北京时间时区差8小时,TODAY()将输出为2020-11-09号,两者相减将得到-1(-24小时)。
无法在公式中确定用户的时区。如果您的所有用户都在同一时区,则可以通过加或减用户的时区和 GMT 之间的时差以调整时区差别为您的已转换值。然而,由于时区会受夏令时的影响,同时每年的 DST 开始和结束日期都不同,因此很难在公式中管理。