我正在尝试在我的程序中进行时区转换,但遇到了一些困难。下面是我的
data GMT_conv;
set table;
if city in ('Atlanta', 'Baltimore' , 'New York') then conv = -5;
if city in ('Minneapolis') then conv = -6;
if city in ('Salt Lake City') then conv = -7;
if city in ('San Francisco') then conv = -8;
run;然而,这只在夏季是正确的。夏令时在三月份的第二个星期天和十一月的第一个星期天有所不同。我想不出一个方法来做这件事if语句(在SAS或proc sql中)
我想要的:
if (between 2nd sunday in march and 1 sunday of november)
then conv +1;有什么建议吗?
发布于 2021-06-28 22:50:35
我的建议是使用SAS内置的时区函数和格式/信息,而不是使用您自己的。
首先,SAS's help page on time zones展示了如何使用时区指定时间。然后,您可以看到如何使用TZONES2U函数将see转换为UTC,或者使用TZONEU2S将其转换回UTC。这将自动处理夏令时!
例如:
data time_data;
format dtval datetime17.;
input city $ dtval :datetime17.;
datalines;
Atlanta 08JUN2021:11:00:00
Baltimore 08JAN2021:11:00:00
Chicago 08JUN2021:11:00:00
Dallas 08JAN2021:11:00:00
;;;;
run;
data want;
set time_data;
length tz $32;
if city in ('Atlanta','Baltimore') then tz='America/New_York';
if city in ('Chicago','Dallas') then tz='America/Chicago';
format dtval_utc datetime17.;
dtval_utc = tzones2u(dtval,tz);
time_diff = dtval-dtval_utc;
format time_diff time8.;
run;这显示了DST的差异(注意亚特兰大在夏天是4个小时,而巴尔的摩在冬天是5个小时。)
当然,您仍然需要能够知道正确的时区是什么;您可以像最初那样手动完成,也可以在某种程度上进行查找(可能使用邮政编码和SASHELP.ZIPCODE)。
https://stackoverflow.com/questions/68164805
复制相似问题