首页 > 解决方案 > 为什么Stata中显示的日期不正确

问题描述

本地系统日期时间为 2021 年 1 月 8 日晚上 10:34。

在Stata我写

local datestamp: di %tdCCYY-NN-DD daily("S_DATE","DMY")
display `datestamp'    

输出是2012

如果我写

di %tdCCYY-NN-DD daily("S_DATE","DMY")

我明白了2021-01-08

为什么会出现差异?这让我很困惑。当我显示它时,我清楚地分配datestamp了它显然有问题。

标签: stata

解决方案


执行摘要:将其display视为2021-01-08数字表达式并对其进行评估。2021 - 1 - 8 = 2012,2012你看到的也是。

这是一个微妙的问题,但答案将根据自己的规则显示 Stata 的完美逻辑。

问题中发布的代码省略了$之前的关键符号S_DATE,它表示一个全局宏,特别是一个包含当前每日日期的系统宏,从您的操作系统获得。

现在是我所在时区的 2021 年 1 月 9 日,但我的示例将与您的示例一样有效,以显示正在发生的事情。您定义了一个local宏,然后在对display. 该display命令有一个设计倾向,即在显示计算结果之前计算它看到的任何表达式的结果。

display慢慢来:解释你的命令有两个截然不同的步骤。首先,作为解释任何 Stata 命令行的问题,所有对本地和全局宏的引用都将替换为这些宏的内容(如果它们存在;引用不存在的宏并不是错误,但那是这里不是问题)。其次,display评估它看到的任何表达式,然后显示该表达式的结果。尽管有它的名字,但它display并不是为了直接向您显示任何存在的宏,尽管如果评估它的结果使其与呈现时相同,就会发生这种情况。因此,如果一个本地宏包含该字符串foo,这display将显示给您 -- 除非foo是标量或变量的名称,在这种情况下,将不显示名称,仅显示该标量或该变量的值(在第一次观察中,在后一种情况下)。

无需解释或计算即可准确查看宏内部内容的命令是macro list.

为了这一点,请考虑这里的不同结果。在第一个display命令中,引号" "是功能性的,而不是装饰性的,并指示display将其输入视为字符串。如果没有引号,display则倾向于将它看到的内容视为数字,在这里它看到一个表达式 2021 MINUS 1 MINUS 9,其计算结果为 2011。前导零被忽略。正如您所报告的,在您的情况下,您的日期是 2021-01-08,结果是 2012 年。

. local datestamp: di %tdCCYY-NN-DD daily("$S_DATE","DMY")

. di "`datestamp'"
2021-01-09

. di `datestamp'
2011

您可以通过问题中的最后一条语句得到正确答案。您输入display了一个数字,但指示它使用每日日期显示格式来解释该数字,您得到的正是您所要求的和您期望的。22288 是或曾经是 2021 年 1 月 8 日,比例尺为 1960 年 1 月 1 日的原点 0。


推荐阅读