我在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;
谢谢, 斯蒂
答案 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;