2012-09-30 21 views
7

में युग को तिथि में कनवर्ट करना मेरे पास मैटलैब में एपोक मिलीसेकंड (संख्याओं की सरणी) की एक सरणी है। मैं इन्हें यूटीसी डेट-टाइम प्रारूप में परिवर्तित करना चाहता हूं, जैसे कि डीडी-एमएम-वाईवाईवाई एचएच: एमएम।मैटलैब

क्या ऐसा करने के लिए एक पूर्व परिभाषित मैटलैब तरीका है या क्या मुझे अपना स्वयं का कार्य लिखना होगा?

+2

आप शायद 'डेटस्टर' फ़ंक्शन की तलाश में हैं। –

उत्तर

18

मान लीजिए, आप एक वेक्टर time_unix के साथ शुरू है, तो:

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

नोट्स:

1) matlab के समय की परिभाषा देखें।

2) 8.64e7 एक दिन में मिलीसेकंड की संख्या है।

3) मैटलैब किसी भी समय-क्षेत्र बदलावों को लागू नहीं करता है, इसलिए परिणाम एक ही यूटीसी समय है।

4) पिछड़े परिवर्तन के लिए उदाहरण:

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

matlab समय यहाँ संख्यात्मक है:

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

unix_time = 

      1339118367664 

संक्षेप में, यहाँ दो कार्य कर रहे हैं। आप इसे datestr()

+0

बहुत बढ़िया।छोटी सी चेतावनी है कि कुछ यूनिक्स टाइमस्टैम्प माइक्रो- (या यहां तक ​​कि नैनो-) सेकंड में हैं, ताकि '864e5' को' 864e8' या '864e11' होने की आवश्यकता हो। – charleslparker

1

का उपयोग करके स्ट्रिंग में हमेशा परिवर्तित कर सकते हैं मैंने उपरोक्त कोड की कोशिश की, लेकिन परिणाम गलत थे। मुझे एहसास हुआ कि मुख्य त्रुटि यूनिक्स समय (युग समय) की अजीब परिभाषा से संबंधित है। Unix time (epoch time) को सेकंड की संख्या 1-1-19 70 के बाद, 00h: 00, ** मिली ** सेकंड (http://en.wikipedia.org/wiki/Unix_time) की संख्या के रूप में परिभाषित नहीं किया गया है। इस परिभाषा के साथ, यूनिक्स समय को 8.64e7 के बजाय 8.64e5 द्वारा विभाजित किया जाना चाहिए।

इसके अलावा, datenum('1970', 'yyyy') परिणाम 1-1-19 70, 00h: 00 के वांछित संदर्भ समय में प्रतीत नहीं होता है।

यहाँ मेरी बेहतर कोड है:

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

Serg का जवाब है कि मैं क्या सामान्य रूप से उपयोग है, जब मैं MATLAB में काम कर रहा हूँ। आज मुझे लगता है कि मैं MATLAB में दिनांक में रूपांतरण करना चाहता हूं क्योंकि शीर्षक कहता है - प्रश्नपत्र में निर्दिष्ट डेटास्ट्रिंग रूपांतरण के बिना - और खोल से तारीख संख्या आउटपुट।

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

यह वास्तव में आप क्या उम्मीद करेंगे के सिर्फ बैश बराबर है:

यहाँ है कि मैं क्या गोल तारीख नंबर के लिए पर बसे है 719,529 युग के datenum है (1970-01-01 या MATLAB में datenum(1970,1,1))। मैं भी हाल ही में ksh के माध्यम से fumbling रहा हूँ और यह इस के साथ वहां किया जा सकता है लगता है: - मैं में परेशान नहीं किया

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

एक पक्ष व्यायाम के रूप में, मैं में बैश तारीख पर दशमलव भाग में वापस शामिल किया ksh, लेकिन यह केवल अंकगणित है और इसी तरह जाता है:

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