日期和时间运算符

date,datetime 值基本上有两个运算符。 +和 - 重载(可能是 C 术语)来做日期/日期时间数学:

操作者 描述
+ 将日期(日期)或秒(日期时间)添加到日期/日期时间值。
- 获取两个日期/日期时间值的差异。从日期时间值中减去天数(日期)或秒数(日期时间)。

+是更容易的。它有两个操作数,一个是日期或日期时间值,另一个是数字(尽管你可以使用任何数字,但它是一个整数用于所有实际目的)。

当其中一个操作数是日期时,则数字操作数被视为

? Date() + 10 && Get the date 10 days later
* VFP is leap year aware when doing date math
? Date(2016, 2, 28) + 1 && Add 1 day to Feb 28, 2016. Returns Feb 29, 2016.
? Date(2017, 2, 28) + 1 && Add 1 day to Feb 28, 2017. Returns Mar 1, 2017.

当其中一个操作数是日期时间时,则数字操作数被视为

一天有 24 * 60 * 60 = 86400 秒

? Datetime() + 86400 && Add 1 day to current datetime. 

添加 4 小时 15 分钟到 2016 年 1 月 1 日下午 2:20

? Datetime(2016, 1, 1, 14, 20, 0) + (4 * 3600 + 15 * 60) 

输出 2016 年 1 月 1 日星期五,下午 6:35:00。

使用?进行简单打印,你在屏幕上看到的内容取决于你的日期设置。例如,如果你没有更改任何内容,则日期设置为美式(MDY),12 小时格式(上午/下午)和世纪仅显示最后 2 位数字。

日期和日期时间有一个特殊符号^,强制将字符串严格解释为 yyyy / MM / dd [HH:mm:ss | hh:mm:ss tt]格式。因此^也可以被视为日期/日期时间运算符。例如,考虑一些数据来自源,格式为 201610082230(yyyyMMddHHmm)。要将该值作为有效的日期时间:

Local cSample, tSample
cSample = '201610082230'
tSample = Ctot(Transform(m.cSample, '@R ^9999/99/99 99:99'))
? Transform(m.tSample, '@YL')

输出(取决于系统的长日期设置):

2016 年 10 月 8 日星期六,下午 10:30:00

- 用于减法。它的操作数要么都是日期/日期时间值,要么是日期/日期时间,另一个是数字。

让我们从更简单的日期/日期时间和数字操作数开始(比如使用+运算符):

当其中一个操作数是日期时,则数字操作数被视为

? Date() - 10 && What was the date 10 days ago?
? Date(2016, 3, 1) - 1 && Returns Feb 29, 2016.
? Date(2017, 3, 1) - 1 && Returns Feb 28, 2017.

当其中一个操作数是日期时间时,则数字操作数被视为

? Datetime() - 86400 && Go back exactly one day

now 获得 1 小时 30 分钟前:

? Datetime() - (1 * 3600 + 30 * 60) 

第二种形式是获取两个日期/日期时间值之间的差异。操作数是日期或日期时间,你不能同时使用日期和日期时间(根据需要进行类型转换,VFP 不会为你执行此操作)。规则在+和 - 中,操作数是日期,然后差异以天为单位,操作数是日期时间,然后差异以单位

新年前夕(2016 年)有多少天?

? Date(2016, 12, 31) - Date()

午夜还剩几秒钟?

? Dtot(Date()+1) - Datetime()

在上一个示例中,我们使用了日期/日期时间函数 DTOT - DateToTime 来获取明天的午夜值。有许多有用的日期/日期时间函数,我们跳过它们,因为它们在技术上不被认为是运算符(尽管它们在日期/日期时间运行:)同样适用于其他运算符。

日期/日期时间减法已签名。也就是说,如果你使用较小的日期/日期时间作为第一个操作数,则结果将为负数。如果你需要获得正结果而无论日期/日期时间顺序如何,你可以使用 abs() 函数。