Update (2014-12-16): I now greatly recommend to use the Joda Time library instead of this function:
http://joda-time.sourceforge.net/
I have been using the C# port Noda Time lately and it is perfectly suited for this kind of tasks.
-----------------
As I could find no built-in function nor reliable contribution to achieve that, I had no choice but to write my own, leveraging the GregorianCalendar Java class.
Usage is quite simple:
targetDST = TimezoneConvert( dn, fromTimezone, toTimezone )
The datenum dn corresponds to the datetime you want to convert. Just specify from which timezone it comes and the target timezone, and you should get the expected result, that takes into account daylight saving time.
Feel free to let me know if I can extend it to support more situations (like Julian Calendar, obviously ;-).
You can get the name of the available timezones using this command:
TimeZone.getAvailableIDs
after importing the relevant java packages.
import java.lang.String
import java.util.* java.awt.*
import java.util.Enumeration
Erwin Mayer (2021). Convert between world time zones with daylight saving times (https://www.mathworks.com/matlabcentral/fileexchange/27953-convert-between-world-time-zones-with-daylight-saving-times), MATLAB Central File Exchange. Retrieved .
Inspired: Round Dates and Times, Timezone Convert by Erwin Mayer with vector support
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Create scripts with code, output, and formatted text in a single executable document.
Hi, I am looking at the Joda Time library, and could anyone show how to call/use it from matlab? Thx!
I incorrectly added one to the milliseconds below, they need to be rounded instead:
t1.set(Calendar.MILLISECOND, round((S - fix(S)) * 1000));
Thanks for providing this function, Erwin! One quick thing: the set function used does not support milliseconds, so those have to be set manually. To fix this issue (and keeping the Financial Toolbox dependency fix from Scott below), the t1.set... line in the current code has to be replaced with the following lines:
[Y, M, D, H, MN, S] = datevec(dn);
t1.set(Y, M-1, D, H, MN, S);
t1.set(Calendar.MILLISECOND, (S - fix(S)) * 1000 + 1);
otherwise, it seems like milliseconds get set to a random number.
Thanks
Here's a suggestion for a vectorized version of this function:
function time = convertTZone(time, TZoneOld, TZoneNew)
OffSet = now - TimezoneConvert(now, TZoneOld, TZoneNew);
time = time - OffSet;
end
@Scott, I applied your 'fix', but do not observe your issue.
t1 = datestr(TimezoneConvert(datenum('31-Mar-2013 00:59:59'),'UTC','Europe/Berlin'))
t2 = datestr(TimezoneConvert(datenum('31-Mar-2013 01:00:00'),'UTC','Europe/Berlin'))
Results in:
t1 =
31-Mar-2013 01:59:59
t2 =
31-Mar-2013 03:00:00
as expected.
So I think your fix is ok.
Hi, currently the function supports only one date conversion, due to Calendar.set method limitations.
How could I modify it to make fast conversions for multiple dates? i.e.if dn would be a vector.
Great tool. A word of warning though: as noticed by Matt Aldrich it doesn't accept multidimensional arrays. But if you loop sequentially over all array elements (datenumbers) it works like a charm.
Hello Scott, I would be happy to help more, unfortunately I don't have Matlab installed right now, and I would greatly suggest to use the Joda Time library instead, to perform the same task as in my original script:
http://joda-time.sourceforge.net/
I have been using the C# port Noda Time lately and it is perfectly suited for this kind of tasks.
@Benjamin, this library would also be more reliable to avoid the kind of rounding errors you have observed.
Hi Erwin, thanks for the reply.
I tried to remove the dependency on the financial toolbox and this almost worked: for Germany, the transition from/to daylight savings times happens at midnight, which isn't correct:
http://www.timeanddate.com/worldclock/timezone.html?n=37
But since I'm not totally certain about what the dependency-causing financial toolbox functions do, the problem might lie with my hacks. Here's the change I made to TimezoneConvert.m:
% Remove dependence on financial toolbox
% t1.set(year(dn), month(dn)-1, day(dn), hour(dn), minute(dn), second(dn))
[Y, M, D, H, MN, S] = datevec(dn);
t1.set(Y, M-1, D, H, MN, S);
Does this hack give the same answer as when using the FT functions?
Scott: Yes, it requires the financial toolbox.
When I run it, I get the error:
??? Undefined function or method 'year' for input arguments of type 'double'.
Error in ==> TimezoneConvert at 11
t1.set(year(dn), month(dn)-1, day(dn), hour(dn), minute(dn), second(dn))
Does this require the financial toolbox?
Sorry, I did not finish the comment but the Matlab comment already got submitted.
Using the same code if we ignored the seconds difference the time conversion is incorrect as well for historical daylight savings:
nDates1 = datenum([2012 6 21 6 0 0]);
tDates1 = TimezoneConvert(nDates1, 'EST', 'Hongkong');
datevec(tDates1)
ans = 2012 06 21 19 0 0.34
6am EST on June 21 does not equate to 7pm China Standard Time on June 21st (as there is no daylight savings then).
There seems to be a rounding error. Using following code generates 0.34 seconds difference. I believe you need to floor some of the calculations when performing this calculation as the precision isn't correct.
nDates1 = datenum([2012 6 21 6 0 0]);
tDates1 = TimezoneConvert(nDates1, 'EST', 'Hongkong');
datevec(tDates1)
ans =
1.0e+03 *
2.0120 0.0060 0.0210 0.0190 0 0.0003
What about vectorized support?
Thank you so much for the file... I was always working on APIs, which cannot display historical DST... Never thought matlab itself can do the job... Much appreciation!
thank you!
Hi Justinas, it should adjust historical time for the DST, that was the purpose. At least provided the functions from the Java package support them (probably not for dates very far away) Let me know if it does not work with a special case.
This function does not seem to adjust historical time for the DST, does it?
"Feel free to let me know if I can extend it to support more situations"
Well, since K E wasn't explicit: can you make it Financial-Toolbox-free (i.e., not dependent on having that)?
OK, that's why - I don't have the Financial Toolbox.
Thanks, KE
Hi K E, from what I could see these functions are normally part of the Financial Toolbox. Aren't they enabled by default?
Seems to crash because the following mfiles are not included:
year
month
day
hour
minute
second
Or have I misunderstood how to run this?
t1 = TimezoneConvert(now, 'UTC', 'US/Eastern')