将GMT日期时间转换为本地

时间:2014-09-17 13:10:11

标签: sas

我在GMT时区有一个日期时间值。如何将其转换为我当地的时区? 我希望有一个功能。请注意,由于夏季,我不能仅仅添加或减少差异。 例如,函数可以这样工作:

data _null_;
  gmtdatetime="17SEP14:09:42:10"dt;
  localdatetime=tz2local(gmtdatetime,"GMT");
run;

我尝试了一些格式和信息的组合而没有运气:

data _null_;
  gmtdatetime="17SEP14:09:42:10"dt;
  a=put(gmtdatetime,E8601DZ20.0);*Converts the value to "2014-09-17T09:42:10Z" to indicate that it is GMT;
  localdatetime=input(a,B8601DT.);*Reads the GMT value;
  put localdatetime datetime.;*This still prints the value as the original GMT value...;
run;

谢谢, 斯蒂

4 个答案:

答案 0 :(得分:2)

我创建了一个返回GMT偏移量的函数,但是当我编译它时,我收到了这个错误:

ERROR: Built-in SAS FUNCTION or SUBROUTINE already exists with name 'GMToff'.

事实证明,SAS中有一个未记录的函数返回GMT偏移量,幸运的是我选择了相同的名称! Here是一些使用示例。 无论如何,它不会像我想的那样在特定时间返回偏移量,仅用于当前时间。 这是一个函数,它将日期时间转换为“本地”时间,给定一个时区(仅支持GMT,但根据需要添加额外的时区应该是微不足道的):

proc fcmp outlib = Apfmtlib.funksjoner.localtime;
function localtime(datetime,tz$);
    if upcase(tz)="GMT" then do;
      offset_normal=3600;
      offset_summer=7200;
    end;
    localtime=datetime+offset_normal;
    /*If datetime is between 1 AM the last Sunday of March and 1 AM the last Sunday of October it is "summertime" in central Europe:*/
    if intnx('week',mdy(3,31,year(datepart(datetime))),0)*86400 + 3600 le datetime le intnx('week',mdy(10,31,year(datepart(datetime))),0)*86400 + 3600 then localtime=datetime+offset_summer;;
    return(localtime);
endsub;
quit;
options cmplib = Apfmtlib.funksjoner;
/*Usage examples:*/
data _null_;
    gmtdatetime="17SEP14:09:42:10"dt;
    localdatetime=localtime(gmtdatetime,"GMT");
    put localdatetime datetime.;
    gmtdatetime="17DEC14:09:42:10"dt;
    localdatetime=localtime(gmtdatetime,"GMT");
    put localdatetime datetime.;
run;

答案 1 :(得分:2)

  

我在GMT时区有一个日期时间值。我怎样才能把它转换成我的   当地时区?我希望有一个功能。请   请注意,我不能只是添加或减少差异,因为   夏天。

有一个功能:

TZONEU2S功能 将UTC日期时间值转换为SAS日期时间值。 http://documentation.sas.com/?docsetId=nlsref&docsetTarget=n1ien0skr1u9swn1f00w7hizdg9c.htm&docsetVersion=9.4&locale=en

指定区域ID时,SAS使用的时区由时区名称和夏令时规则决定。

示例:

data;
  do d = 20 to 30;
    date = '28FEB2018'd + d;
    dt = dhms(date, 12, 0, 0);
    dt2 = tzoneu2s(dt,'EUROPE/LONDON'); 
    output;
  end;
  format date E8601DA. dt dt2 E8601DT. ;
run;

proc print;
run;

答案 2 :(得分:1)

我做了一个格式,它会给我从GMT到我的时区的偏移量(以秒为单位)。在中欧,夏令时开始于格林威治标准时间3月的最后一个星期日,格林威治标准时间10月的最后一个星期日结束。

data fmt(drop=year);
  attrib hlo length=$1
         start end format=datetime.;;
  fmtname="gmtoff";
  type="N";
  do year=1980 to 2080;
    start=intnx('week',mdy(3,31,year),0)*86400 + 3600;*Last Sunday in March 1 AM;
    end=intnx('week',mdy(10,31,year),0)*86400 + 3600;*Last Sunday in October 1 AM;
    label=7200;*Two hours offset in summertime;
    output;
  end;
  start=.;end=.;
  hlo="O";
  label=3600;*When it is not summertime, it is one hour offset;
  output;
run;
proc format cntlin=fmt;
run;

/*Example of usage:*/
data _null_;
  gmtdatetime="17SEP14:09:42:10"dt;
  localdatetime=gmtdatetime + put(gmtdatetime,gmtoff.);
  put localdatetime datetime.;
  gmtdatetime="17DEC14:09:42:10"dt;
  localdatetime=gmtdatetime + put(gmtdatetime,gmtoff.);
  put localdatetime datetime.;
run;

答案 3 :(得分:1)

在SAS 9.4中,我认为函数tzonesoff可能是您问题的答案。该函数返回您的时区和GMT之间的差异。

data _null_;
  gmtdatetime="17SEP14:09:42:10"dt;
  tzoffset = tzoneoff('Europe/Copenhagen');
  localdatetime=gmtdatetime+tzoffset;
  put localdatetime= datetime.;
run;