SAS 夏令时转换 SAS

SAS daylight savings time conversion SAS

我正在尝试在我的程序中进行时区转换,但 运行 遇到了一些困难。下面我有

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;

有什么建议吗?

我的建议是使用 SAS 的内置时区函数和 formats/informats,而不是自己动手。

首先,SAS's help page on time zones shows how to specify times with a time zone. Then, you can see how to use the TZONES2U function to convert SAS datetimes to UTC, or TZONEU2S转换回来。这将自动处理夏令时!

例如:

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 ;
  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;

这显示了夏令时的差异(请注意亚特兰大在夏季有 4 小时的假期,而巴尔的摩在冬季有 5 小时的假期。)

当然,您仍然需要能够知道正确的时区是什么;您可以手动执行此操作,就像您最初所做的以及我在示例中所做的那样,或者您可以在某种程度上进行查找(可能使用邮政编码和 SASHELP.ZIPCODE)。