Search code examples
matlabutcepoch

Converting Epoch to Date in Matlab


I have an array of Epoch milliseconds (array of numbers) in Matlab. I would like to convert these into UTC date-time format, such as DD-MM-YYYY HH:MM.

Is there a pre-defined Matlab way to do this or will I have to write my own function?


Solution

  • Suppose, you start with a vector time_unix, then:

    >> time_unix = 1339116554872; % example time
    >> time_reference = datenum('1970', 'yyyy'); 
    >> time_matlab = time_reference + time_unix / 8.64e7;
    >> time_matlab_string = datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF')
    
        time_matlab_string =
    
        20120608 00:49:14.872
    

    Notes:

    1) See the definition of matlab's time.

    2) 8.64e7 is number of milliseconds in a day.

    3) Matlab does not apply any time-zone shifts, so the result is the same UTC time.

    4) Example for backward transformation:

    >> matlab_time = now;
    >> unix_time = round(8.64e7 * (matlab_time - datenum('1970', 'yyyy')))
    
    unix_time =
    
                 1339118367664
    

    To summarize, here are two functions:

    function tm = unix2matlab(tu)
        tm = datenum('1970', 'yyyy') + tu / 864e5;
    end
    function tu = matlab2unix(tm)
        tu = round(864e5 * (tm - datenum('1970', 'yyyy')));
    end
    

    The matlab time here is numeric. You can always convert it to string using datestr()

    Update for nanoseconds

    time_unix_nanos = 1339116554872666666;
    millis = round(time_unix_nanos / 1e6);
    nanos = time_unix_nanos - 1e6 * millis;
    time_matlab = unix2matlab(millis);
    s = [datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF'), num2str(nanos)];
    
            s =
            20120608 00:49:14.872666666