Azzera filtri
Azzera filtri

how to convert 18 digits timestamp to readable date and time in MATLAB

67 visualizzazioni (ultimi 30 giorni)
I have data with a time step consists of 18 digits such as 634019142119225390. This date should be in February 2010 by the way.
How can i convert this into readable date and time in MATLAB ?
Unfortunately i don't know what is the format of this timestamp. Is it UNIX or Julian or what.
Many Thanks in advance
  6 Commenti
Guillaume
Guillaume il 24 Apr 2015
I'm not sure why you're providing more samples. As far as I can tell, I've answered your question.

Accedi per commentare.

Risposta accettata

Guillaume
Guillaume il 23 Apr 2015
Modificato: James Tursa il 24 Apr 2015
This page may be useful.
Most likely, your timestamp is a .Net System.DateTime
>>ts = int64(634019142119225390);
>>dt = System.DateTime(ts); %Note that you need to be on Windows for this to work
>>dt.ToString
ans =
16/02/2010 00:00:00
  5 Commenti
Guillaume
Guillaume il 24 Apr 2015
As per the documentation of System.DateTime, its resolution is 100 nanoseconds. Therefore the difference between your two timestamps is only 1 microsecond.
You need to add 10,000,000 (1e7) to just go up one second.

Accedi per commentare.

Più risposte (2)

Peter Perkins
Peter Perkins il 24 Apr 2015
Another option, if you have MATLAB R2014b or later, is this:
>> x = [uint64(634019142119225390) uint64(634019142129597610) uint64(634019142139821660)]
x =
634019142119225390 634019142129597610 634019142139821660
>> datetime(double(x)/1e7,'ConvertFrom','epochtime','Epoch','1-Jan-0001','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS')
ans =
16-Feb-2010 10:50:11.922531250 16-Feb-2010 10:50:12.959757812 16-Feb-2010 10:50:13.982171875
But that's not exactly right -- those uint64's are larger than flintmax, so casting them to double introduces round-off. You may not care about 100ns resolution. If you only cared about 1ms resolution, you could do this:
>> datetime(double(x/1e4)/1e3,'ConvertFrom','epochtime','Epoch','1-Jan-0001','Format','dd-MMM-yyyy HH:mm:ss.SSS')
ans =
16-Feb-2010 10:50:11.923 16-Feb-2010 10:50:12.960 16-Feb-2010 10:50:13.982
But to get exactly what you started with, do this:
>> secs = (x-.5e7)/1e7
secs =
63401914211 63401914212 63401914213
>> milliSecs = double(x - uint64(secs)*1e7)/1e4
milliSecs =
922.539 959.761 982.166
>> datetime(secs,'ConvertFrom','epochtime','Epoch','1-Jan-0001','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS') + milliseconds(milliSecs)
ans =
16-Feb-2010 10:50:11.922539000 16-Feb-2010 10:50:12.959761000 16-Feb-2010 10:50:13.982166000

William Bertram
William Bertram il 8 Mar 2017
634019142119225390 appears to be the number of nanoseconds that has elapsed since 01/01/0001 00:00. Here is a quick Powershell to convert that to human readable:
$timestamp = 636244407153688066 / 10000000
$epochDate = [datetime]"01/01/0001 00:00"
$epochDate.AddSeconds($timestamp)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by