Will you show me examples of changing time zones with datetime?
103 views (last 30 days)
Show older comments
Ellyn Gray
on 24 Oct 2016
Commented: Steven Lord
on 4 Dec 2019
I am currently working with data that comes in GMT. I want to get averages of when an event began and ended in local time (which is pacific standard time, a difference of 7 or 8 hours depending on the time of year). I don't want to just subtract 7 or 8, because datetime keeps track of daylight savings time, which is super helpful.
I change my time with the following code:
dateHourlyTZ = datetime(dateHourlyLocal, 'TimeZone','America/Los_Angeles','Format','d-MMM-y HH:mm:ss Z');
And as a result, I get dates that look like the following:
'1-Dec-1994 15:00:00 -0800'
'1-Dec-1994 16:00:00 -0800'
'1-Dec-1994 17:00:00 -0800'
'1-Dec-1994 18:00:00 -0800'
'2-Dec-1994 11:00:00 -0800'
'2-Dec-1994 15:00:00 -0800'
'5-Dec-1994 15:00:00 -0800'
'5-Dec-1994 16:00:00 -0800'
'18-Dec-1994 16:00:00 -0800'
'18-Dec-1994 17:00:00 -0800'
'23-Dec-1994 15:00:00 -0800'
'23-Dec-1994 16:00:00 -0800'
'23-Dec-1994 17:00:00 -0800'
'27-Dec-1994 15:00:00 -0800'
This is great except for the fact that it doesn't actually subtract the 8 hour time difference from the time. I considered maybe converting it to datestring and then manually subtracting the difference (whether it's 7 or 8 hours for the time of year), but when I convert it to datestring, I lose the -0800 or -0700.
The truth is I think I just don't understand all of what I can do with datetime or how the timezone change is applied. I've read all the Mathworks's info on datetime, but if you have any examples of how to manipulate timezones better or have any additional insight, that would be great. I'm not finding useful examples right now online!
Thanks a lot! -- Ellyn
0 Comments
Accepted Answer
Walter Roberson
on 24 Oct 2016
If you have not set the TimeZone on a datetime before, then it does not assume UTC to be converted. Setting the TimeZone for such an object does not change the associated time: it leaves the time alone and fills in the TimeZone field.
For an object that has a TimeZone filled out, changing the TimeZone will changed the displayed time.
10 Comments
K E
on 4 Nov 2016
This worked example is very helpful. Where do I go to suggest a similar example gets added to the online datetime documentation?
More Answers (2)
Marc Jakobi
on 24 Oct 2016
Edited: Marc Jakobi
on 24 Oct 2016
Setting the TimeZone property doesn't change the time of a datetime vector, it just tells Matlab which time zone the datetime object is in. So setting
dateHourlyLocal, 'TimeZone','America/Los_Angeles')
will only change the property (and maybe the dates at which daylight savings occurs), but not the time itself. The TimeZone property is especially useful if you have two datetime vectors from two different time zones. For example, subtracting two datetimes with the same value - one in New York, one in Berlin - will result in 06:00:00 (the time difference between the two time zones).
So if you would like to convert the time, you could do something like
dt = datetime(dateHourlyLocal, 'TimeZone','America/Los_Angeles') - dateHourlyLocal;
dateHourlyTZ = datetime(dateHourlyLocal, 'TimeZone','America/Los_Angeles') - dt;
Or the other way round (depending on whether you would like to add or subtract time). You may have to experiment with this a bit.
Al in St. Louis
on 23 May 2018
So, I have to tell MATLAB that the timezone is London if I have UTC times. That's not very intuitive.
3 Comments
Al in St. Louis
on 4 Dec 2019
This doesn't help me as I have times that are UTC, but I have not figured out how to tell MATLAB that.
Steven Lord
on 4 Dec 2019
Natick, MA (the location of MathWorks HQ) is in the America/New_York time zone, as I can see by comparing a datetime created by specifying the 'local' time zone with one in America/New_York.
tLocal = datetime('now', 'TimeZone', 'local');
tNY = datetime('now', 'TimeZone', 'America/New_York');
If I view the information from the list of time zones for the UTC offset for America/New_York it's -5. We're not in Daylight Savings Time right now, so I can ignore the DSTOffset.
tz = timezones;
tz(tz.Name == "America/New_York", :)
So if I convert tNY to UTC, or create a new datetime in the UTC time zone, the time should be five hours different. I can do this using the 'Etc/UTC' time zone.
tUTC = datetime('now', 'TimeZone', 'Etc/UTC');
tNYToUTC = tNY; tNYToUTC.TimeZone = 'Etc/UTC';
If you display these datetime values tLocal and tNY should have (very close to, modulo how long it takes you to type the command) the same time, and tUTC and tNYToUTC should have a time that's (very close to) five hours different.
tLocal, tNY, tUTC, tNYToUTC
See Also
Categories
Find more on Dates and Time in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!