BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
PeteLund
Obsidian | Level 7

I'm getting historical data (back 20+ years) that contains UTC times that I need to convert to local time.  The local UTC offset is different depending on the time of year - for me, either seven or eight hours.  It seems like the "new" TIMEZONEU2S function only works with the current days UTC offset.  Is there a way to get this done directly in SAS?

1 ACCEPTED SOLUTION

Accepted Solutions
ballardw
Super User

Perhaps the issue is 1) the start datetime is not actually UTC or 2) Not applying the timezone correctly:

data _null_;
  format udt ConvertedDT datetime18.;
  input udt is8601dz.;
  ConvertedDT = TZONEU2S(udt,'America/Los_Angeles');
  put udt= converteddt=;
datalines;
2018-02-28T22:38:56+00:00
2018-03-01T22:38:56+00:00
2018-03-02T22:38:56+00:00
2018-03-03T22:38:56+00:00
2018-03-10T22:38:56+00:00
2018-03-11T22:38:56+00:00
2018-04-01T22:38:56+00:00
2018-05-01T22:38:56+00:00
2018-06-01T22:38:56+00:00
run;

Generates:

udt=28FEB18:22:38:56 ConvertedDT=28FEB18:14:38:56
udt=01MAR18:22:38:56 ConvertedDT=01MAR18:14:38:56
udt=02MAR18:22:38:56 ConvertedDT=02MAR18:14:38:56
udt=03MAR18:22:38:56 ConvertedDT=03MAR18:14:38:56
udt=10MAR18:22:38:56 ConvertedDT=10MAR18:14:38:56
udt=11MAR18:22:38:56 ConvertedDT=11MAR18:15:38:56
udt=01APR18:22:38:56 ConvertedDT=01APR18:15:38:56
udt=01MAY18:22:38:56 ConvertedDT=01MAY18:15:38:56
udt=01JUN18:22:38:56 ConvertedDT=01JUN18:15:38:56

Included some extra dates, the key ones being 10 and 11 Mar since 11 Mar is the first day of DST

View solution in original post

6 REPLIES 6
ballardw
Super User

Some example values, expected result and possibly the location may be helpful to getting a better response.

 

You should likely provide examples where the TIMEZONEU2S is not returning the expected value along with the code you used to do the conversion.

PeteLund
Obsidian | Level 7

Here's a little data step with a couple date/times from my real data and the resulting log:

 

data _null_;
  format OldDT ConvertedDT datetime13.;
  input OldDate mmddyy10. + 1 OldTime time5.;

  OldDT = dhms(OldDate,0,0,OldTime);
  ConvertedDT = TZONEU2S(OldDT);

  put _all_;
datalines;
04/09/2016 20:22
03/02/2018 22:38
run;

 

OldDT=09APR16:20:22 ConvertedDT=09APR16:13:22 OldDate=20553 OldTime=73320 _ERROR_=0 _N_=1
OldDT=02MAR18:22:38 ConvertedDT=02MAR18:15:38 OldDate=21245 OldTime=81480 _ERROR_=0 _N_=2

 

The current UTC offset for Seattle (where I am) is currently -7 and all the conversions done by the TZONEU2S function use that offset. 

 

It would have been -7 on 04/09/2016, so the first row in the log is correct.  But it would have been -8 on 03/02/2018, so row 2 is wrong - the ConvertedDT should be 02MAR18:14:38.

ChrisHemedinger
Community Manager

According to the doc, TZONEU2S should apply daylight savings rules.  I guess you're not seeing that?

Learn from the Experts! Check out the huge catalog of free sessions in the Ask the Expert webinar series.
PeteLund
Obsidian | Level 7

Hi Chris -

 

No, it doesn't seem to be using the daylight savings rules.  If I use that function on the thousands of records I have, covering every day for the past many years, the converted dates are always 7 hours different from the original.

ballardw
Super User

Perhaps the issue is 1) the start datetime is not actually UTC or 2) Not applying the timezone correctly:

data _null_;
  format udt ConvertedDT datetime18.;
  input udt is8601dz.;
  ConvertedDT = TZONEU2S(udt,'America/Los_Angeles');
  put udt= converteddt=;
datalines;
2018-02-28T22:38:56+00:00
2018-03-01T22:38:56+00:00
2018-03-02T22:38:56+00:00
2018-03-03T22:38:56+00:00
2018-03-10T22:38:56+00:00
2018-03-11T22:38:56+00:00
2018-04-01T22:38:56+00:00
2018-05-01T22:38:56+00:00
2018-06-01T22:38:56+00:00
run;

Generates:

udt=28FEB18:22:38:56 ConvertedDT=28FEB18:14:38:56
udt=01MAR18:22:38:56 ConvertedDT=01MAR18:14:38:56
udt=02MAR18:22:38:56 ConvertedDT=02MAR18:14:38:56
udt=03MAR18:22:38:56 ConvertedDT=03MAR18:14:38:56
udt=10MAR18:22:38:56 ConvertedDT=10MAR18:14:38:56
udt=11MAR18:22:38:56 ConvertedDT=11MAR18:15:38:56
udt=01APR18:22:38:56 ConvertedDT=01APR18:15:38:56
udt=01MAY18:22:38:56 ConvertedDT=01MAY18:15:38:56
udt=01JUN18:22:38:56 ConvertedDT=01JUN18:15:38:56

Included some extra dates, the key ones being 10 and 11 Mar since 11 Mar is the first day of DST

PeteLund
Obsidian | Level 7

Forcing the time zone (America/Los_Angeles) in the function call did the trick.

 

Thanks much!

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1272 views
  • 2 likes
  • 3 in conversation