2015-12-10 27 views
1

我試圖編寫一個函數,它需要一個'X:XX PM'形式的字符串,並將其更改爲24HR時間字符串,而不使用AM或PM。Javascript substr()不一致

這意味着:

'12:00 AM」變爲'00:00'

'上午03時半' 變爲'03:30'

'4:00 PM' 變'16:00'

'12:30 PM」變成'12:30'

等。

我使用JavaScript的substr()函數,它似乎工作不一致。下面的代碼:

function unFormatTime(timeString) { 
console.log("length: " + timeString.length); 
console.log("string passed in: " + timeString); 
var hour = 0; 
var minute = ''; 
var amOrPm = ''; 

if (length == 7) { 
    hour = parseInt(timeString.substr(0, 1)); 
    minute = timeString.substr(2, 2); 
    amOrPm = timeString.substr(5, 2); 
} else { 
    hour = parseInt(timeString.substr(0, 2)); 
    minute = timeString.substr(3, 2); 
    amOrPm = timeString.substr(6, 2); 
} 
for (var i = 0; i < timeString.length; i++) { 
    console.log(i + ", 1 " + "'" + timeString.substr(i, 1) + "'"); 
    console.log(i + ", 2 " + "'" + timeString.substr(i, 2) + "'"); 
} 

console.log("unparsed: " + hour + " " + "'" + minute + "'" + " " + "'" + amOrPm + "'"); 

if (amOrPm == "PM") { 
    if (hour != 12) { 
     hour += 12; 
    } 
} else { 
    if (hour == 12) { 
     hour -= 12; 
    } 
} 

if (hour < 10) { 
    hour = '0' + hour; 
} 
console.log("parsed: " + hour + " " + minute + " " + "'" + amOrPm + "'"); 

var newString = hour + ':' + minute; 
console.log(newString); 
return newString; 

}

這個循環是存在的,因爲SUBSTR正在靠不住的。當功能被賦予「4:00」,則循環將打印

0, 1 '4' 
2, 2 '00' 
5, 2 'AM' 

這些被分配到小時,分鐘和AM或PM匹配的字符串時字符串的長度爲7。然而,當我打印的實際變量,我得到:

unparsed: 4 '0 ' 'M' 

因此,分鐘和amOrPm值是不是設置正確。我確信我只是在某個地方有一個錯字,但現在看起來像是Javascript中的某種錯誤,它讓我發瘋。

+1

不一定與您的問題相關,但是:http://blog.codinghorror。com/the-first-rule-of-programming-its-always-your-fault/:) – sirrocco

+0

有沒有理由不嘗試使用Date API,然後進行某種日期解析? http://momentjs.com/將是一個很好的資源。 – jusopi

+0

沒有一個很好的理由,如果我不能弄清楚這一點,我會研究一下。我從substr開始,因爲我正在做的事很簡單,我知道如何使用它。現在更多的是理解爲什麼會發生這種情況。 – banjo78910

回答

1

我注意到的第一件事是

if (length == 7) 

應該

if (timeString.length == 7) 

當我作出這樣的改變,作爲參數與4:00 AM執行的功能,我得到如下:

unparsed: 4 '00' 'AM' 
parsed: 04 00 'AM' 
04:00 

看起來合法嗎?雖然我會建議使用正則表達式來處理這類任務。

+0

Aw geez,我知道這是這樣的。特別是因爲雙位數的時間正常工作。長度未定義,所以它永遠不會到達第一個代碼塊。謝謝!! – banjo78910

0

做的事情可能是另一種方式(顯然這有優勢的情況下沒有處理和驗證未完成):

function parse(input){ 
    if (!input) return ""; 

    var isPM = /pm/i.test(input); // check if pm is in the string 
    var time = input.replace(/(a|p)m/ig, ''); // remove am/pm 
    time = input.replace(' ', ''); // remove spaces 

    var timeParts = time.split(':'); 

    var hour = parseInt(timeParts[0], 10); 
    var minute = parseInt(timeParts[1], 10); 

    if(isPM) { hour+=12; } 
    else if (hour === 12){hour = 0} 

    // transform single digit numbers to double digits: 2 to 02 
    return ('00' + hour).slice(-2) + ':' + ('00' + minute).slice(-2); 
} 

我覺得你的解決方案有點難以理解。

1

我不會用substr方法來解決這個問題。如果你想解決這個sans-external庫,那麼我會採用的香草方法是基於「:」和「」分割字符串。這是CoffeeScript的,但你的想法:

times = [ 
    '12:00 AM' 
    '3:30 AM' 
    '4:00 PM' 
    '12:30 PM' 
] 

converted = [] 

isPm = (s)-> s?.toLowerCase() is 'pm' 

for t in times 
    [hr, min] = t.split ':' 
    [min, amPm] = min.split ' ' 

    if hr is '12' and !isPm(amPm) 
    hr = '00' 

    else if hr isnt '12' and isPm(amPm) 
    hr = parseInt(hr) + 12 

    if hr.toString().length < 2 
    hr = "0" + hr 

    converted.push "#{hr}:#{min}" 

console.log converted # ["00:00", "03:30", "16:00", "12:30"] 

我敢肯定有這樣做的正則表達式的方式,我只是沒有,因爲我通常使用外部庫像moment.js看向深做日期計算和日期字符串解析。