2012-09-30 67 views
7

Tôi có một mảng các mili giây (mảng số) trong Matlab. Tôi muốn chuyển đổi chúng thành định dạng ngày giờ UTC, chẳng hạn như DD-MM-YYYY HH: MM.Chuyển đổi Epoch thành Ngày trong Matlab

Có cách nào được xác định trước Matlab để thực hiện việc này hay tôi sẽ phải viết chức năng của riêng mình?

+2

Có thể bạn đang tìm hàm 'datestr'. –

Trả lời

18

Giả sử, bạn bắt đầu với một vector time_unix, sau đó:

>> 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 

Ghi chú:

1) Xem định nghĩa của thời gian matlab của.

2) 8.64e7 là số mili giây trong một ngày.

3) Matlab không áp dụng bất kỳ thay đổi múi giờ nào, do đó kết quả là cùng thời gian UTC.

4) Ví dụ về biến đổi ngược:

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

unix_time = 

      1339118367664 

Nói tóm lại, đây là hai chức năng:

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

Thời gian matlab đây là số. Bạn luôn có thể chuyển đổi nó thành chuỗi bằng cách sử dụng datestr()

+0

Tuyệt vời.Ít lưu ý rằng một số dấu thời gian unix là trong micro- (hoặc thậm chí nano-) giây ngay bây giờ, để '864e5' có thể cần phải là' 864e8' hoặc thậm chí '864e11'. – charleslparker

1

Tôi đã thử mã trên nhưng kết quả sai. Tôi nhận ra lỗi chính liên quan đến định nghĩa vụng về của thời gian Unix (thời gian epoch). Unix time (epoch time) được định nghĩa là số giây sau 1-1-1970, 00h: 00, không phải là số ** milli ** giây (http://en.wikipedia.org/wiki/Unix_time). Với định nghĩa này, thời gian Unix nên được chia cho 8.64e5 thay vì 8.64e7.

Ngoài ra, datenum('1970', 'yyyy') dường như không dẫn đến thời gian tham chiếu mong muốn từ 1-1-1970, 00h: 00.

Đây là mã được cải tiến của tôi: Câu trả lời

tMatlab = datenum (1970,1,1,0,0) + tUnix/86400; 
0

SERG là những gì tôi thường sử dụng, khi tôi đang làm việc trong MATLAB. Hôm nay tôi thấy mình muốn chuyển đổi thành ngày trong MATLAB làm tiêu đề cho biết - không có chuyển đổi datestring được chỉ định trong phần thân câu hỏi - và xuất số ngày từ trình bao.

Dưới đây là những gì tôi giải quyết trên cho số ngày làm tròn:

TODAY_MATLAB="$[719529 + $[`date +%s`/24/60/60]]" 

Đây thực sự chỉ là bash tương đương với những gì bạn mong đợi: 719.529 là datenum của thời đại (1970/01/01 hay datenum(1970,1,1) trong MATLAB). Tôi cũng đang dò dẫm qua ksh thời gian gần đây và có vẻ như điều này có thể được thực hiện ở đó với:

TODAY_EPOCH=`date +%s` 
TODAY_MATLAB=`expr $TODAY_EPOCH/24/60/60 + 719529` 

Là một tập thể dục bên, tôi đã thêm phần thập phân trở lại vào ngày trong bash - Tôi không bận tâm trong ksh, nhưng nó chỉ là số học và tương tự như vậy:

N_DIGITS=7 
FORMAT=$(printf "%%d.%%0%dd" $N_DIGITS) 

NOW_EP_SEC=`date +%s` 
SEC_PER_DAY=$((24*60*60)) 
NOW_EP_DAY=$(($NOW_EP /$SEC_PER_DAY)) 
SEC_TODAY=$(($NOW_EP_SEC - $NOW_EP_DAY*$SEC_PER_DAY)) 

TODAY_MATLAB="$((NOW_EP_DAY+719529))" 
FRACTION_MATLAB="$(printf '%07d' $((($SEC_TODAY*10**$N_DIGITS)/SEC_PER_DAY)))" 
MATLAB_DATENUM=$(printf $FORMAT $TODAY_MATLAB $FRACTION_MATLAB) 

echo $MATLAB_DATENUM 
Các vấn đề liên quan