2016-12-21 56 views
1

我需要一個函數來將文本中的時間從具有日期字母的格式轉換爲數字。 例如4:15 PM - > 16:15,4:15 AM - > 4:15 AM。目前,我有以下解決方案在JavaScript中繁瑣的時間解析

function formatTime(text){ 
 
\t var find = '([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9] (AM|PM)'; 
 
\t 
 
\t var reg = new RegExp(find, 'g'); 
 
\t 
 
\t pos = 0; 
 

 
\t var result; 
 
\t var formatedText = ""; 
 
\t while((result = reg.exec(text)) !== null) { 
 
\t \t if(result[2] == "PM"){ 
 
\t \t \t var hours= parseInt(result[0], 10); 
 
\t \t \t hours = hours + 12; 
 
\t \t \t var hoursStr = hours.toString(); 
 
\t \t \t var newTime = hoursStr + result[0].substring(result[1].length,result[0].length - 3); 
 
\t \t \t 
 
\t \t \t formatedText += newTime; 
 
\t \t \t pos = reg.lastIndex; 
 
\t \t } else { 
 
\t \t \t formatedText += text.replace("AM","").substring(pos, reg.lastIndex); 
 
\t \t \t pos = reg.lastIndex; 
 
\t \t } 
 
\t } 
 
\t 
 
\t if(pos < text.length){ 
 
\t \t formatedText += text.substring(pos, text.length); 
 
\t } 
 
\t 
 
\t return formatedText; 
 
} 
 

 
console.log(formatTime("Some Text (11:00AM - 1:00PM)"));

我做很好的情況下,像 的console.log(formatTime( 「有些文字(11:00 AM - 1:00 PM)」));但是我努力讓它進程 console.log(formatTime(「Some Text(11:00 AM - 1:00 PM)」));

+0

http://stackoverflow.com/questions/14415618/replace-military-time-to-normal-time-with-javascript – mike510a

+0

*例如4:15 PM - > 16:15,4:15 AM - > 4:15 AM因此,如果是PM,您想要轉換小時,但如果是AM,您希望在結果中留下**「AM」「 ? –

+0

是的,我需要這樣的格式。 – Helga

回答

1

這適用於您的示例。 我已將\\s?添加到正則表達式中,並在切割時間的邏輯(-2而不是-3)上做了小的改動。此外,我已經將變量定義移至函數的開頭,以反映JavaScript中的提升。

function formatTime(text){ 
    var find = '([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s?(AM|PM)';    
    var reg = new RegExp(find, 'g');    
    var pos = 0; 
    var formatedText = ""; 
    var result, hours, hoursStr, newTime;   

    while ((result = reg.exec(text)) !== null) { 
     if (result[2] === "PM") { 
      hours= parseInt(result[0], 10); 
      hours = hours + 12; 
      hoursStr = hours.toString(); 
      newTime = hoursStr + result[0].substring(result[1].length, result[0].length - 2); 

      formatedText += newTime;      
     } else { 
      formatedText += text.replace("AM","").substring(pos, reg.lastIndex); 

     } 

     pos = reg.lastIndex; 
    } 

    if (pos < text.length) { 
     formatedText += text.substring(pos, text.length); 
    } 

    return formatedText; 
} 
+1

爲什麼,因爲你做了什麼?爲什麼你沒有爲他清理正則表達式,或者修復它以使用正則表達式? 'g'標誌的用途,爲什麼在'reg.exec'附近有一個循環? –

0

下面是一個更簡單的方法:使用兩個函數。一個轉換小時,另一個與PM次以及replace()函數匹配。

別逼我......

function convertTime12to24(time12h) { 
 
    const [time, modifier] = time12h.split(' '); 
 

 
    let [hours, minutes] = time.split(':'); 
 

 
    if (hours === '12') { 
 
    hours = '00'; 
 
    } 
 

 
    if (modifier === 'PM') { 
 
    hours = parseInt(hours, 10) + 12; 
 
    } 
 

 
    return hours + ':' + minutes; 
 
} 
 

 

 
function formatTime(i_string) { 
 
    console.log(i_string.replace(/([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])(PM)/gi, function newDate(x) { 
 

 
    return convertTime12to24(x.replace("PM", " PM")) 
 
    })); 
 
} 
 
formatTime("The time is now 4:15PM"); 
 
formatTime("The time is now 12:15PM"); 
 
formatTime("The time is now 4:00AM"); 
 
formatTime("The time is now 12:00AM"); 
 
formatTime("The time is now 11:00PM");

+0

但是根據OP,他希望**保留「AM」。此外,您的代碼似乎正在刪除破折號後的空間。 –

+0

我只是想指出正確的方向 - 這個網站真的不是爲人們創造生產質量答案 - 它幫助解決他們的編程問題 - 因爲我不知道/關心他們的算法如何工作或如何管理導出輸出結果,我只是注意到了輸入錯誤,然後進行了修正,出現了一個依賴於輸入錯誤的硬編碼值。我可能會用不同的方式使用':'作爲分隔符,然後只加上12,如果它的PM是小時部分,但不管 – mike510a

+0

@torazaburo也不表示他們想保留OP中的AM/PM, - 它說4:15 PM - > 16:15 – mike510a