2013-07-26 1150 views
25

我需要在我的代碼中解析和操作沒有日期的時間。例如,我可能會從時間選擇器中得到字符串「15:00」。我想將它變成某種時間對象 - 我通常使用具有不同日期,時間和日期時間對象的Python工作。Javascript解析沒有日期的時間

但是我看到的所有解決方案都集中在使用Date對象。由於需要日期信息,因此無法解析像「15:00」這樣的字符串。我不想將任意日期信息添加到時間 - 特別是因爲日期似乎根據日期和區域設置對夏令時等進行了假設,並且似乎存在自動嘗試將時間轉換爲給定語言環境。此外,我希望能夠增加時間,例如「15:00 + 1小時」

解析和處理與日期無關的「原始」時間的建議解決方案是什麼?

+0

如果您不想編寫自己的代碼來完成此操作,可以使用[Moment.js](http://momentjs.com)或[Date.js](http://www.datejs.com) 。 – Pointy

+0

我建議你自己寫幾行你需要的東西。由於沒有日曆問題,這很簡單。 –

+0

這就是我希望避免的。 Moment.js和Date.js都關注日期時間,而不是時間,因此在使用它之前,您仍然必須將任意日期信息粘貼到時間。我可以想象它的實施並不複雜,但我很驚訝這已經不存在了。 – mangecoeur

回答

13

不幸的是,沒有一個好的解決方案。 JavaScript只有一個Date對象,因爲它真的是日期+時間,所以可能會錯誤地命名。你可能要考慮更深層次的

一兩件事 - 你說你要只有上班時間,但你的意思是一個時間的日或你的意思的時候一個時間?這是兩個相關的概念,但略有不同。

例如,你說你可能想要一個像「15:00 + 1小時」的操作。那麼明顯是16:00這兩種方式。但是「15:00 + 10小時」呢?如果你談論的是持續時間,那將是25:00,但如果你正在談論時間,那麼可能是01:00。

實際上,它可能是而不是是01:00,因爲並非所有的日子都有24小時在其中。有些日子有23,23.5,24.5或25小時,這取決於什麼時區以及DST是在當天開始還是停止。因此,在時間環境下,您可能需要在計算中包含特定的日期和區域。當然,如果你談論的是24小時連續的日子,那麼這一點是無關緊要的。

如果你正在談論持續時間 - 你可能想再次看看moment.js,但不在moment對象。這裏還有另一個對象,moment.duration。參考是here

最後,您可能需要考慮僅使用普通javascript將時間字符串的小時和分鐘解析爲數字。根據需要操作數字,然後再輸出一個字符串。但是,你的問題似乎是你正在尋找更多的管理。

+0

不幸的是,我正在尋找「時間」而不是持續時間(所以moment.js已經出來)。它看起來像沒有管理的解決方案,我不得不使用正則表達式字符串解析 - 這是一個恥辱,因爲這是一種容易產生微妙的錯誤,我喜歡由一個經過良好測試的庫處理的那種煩人的東西。 – mangecoeur

+0

如果你可以在某一天放置那個時間,那麼'日期'或'時刻'仍然是一個好主意。如果它總是被分開(比如一週中每天的餐廳開放時間),邊緣案例更具挑戰性。我不知道有任何好的js庫。抱歉。 –

14

我結束了,因爲我已經在我的應用程序中使用moment使用以下物質:

var str = '15:16:33'; 
var d = new moment(str, 'HH:mm:ss'); 

你可以使用其他格式的字符串見Moment String+Format docs

29

下面是12或24小時次moment.js解決方案:

moment('7:00 am', ['h:m a', 'H:m']); // Wed Dec 30 2015 07:00:00 GMT-0600 (CST) 
moment('17:00', ['h:m a', 'H:m']); // Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 
moment('17:00 am', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 
moment('17:00 pm', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 

http://momentjs.com/docs/#/parsing/string-formats/

+2

我一直在尋找這一整天 –

+0

哇......這就是它!基本上,我的(也可能是OP的)用例的日期時間並不重要。只需要將時間字符串轉換爲有效的momentjs對象。並認爲網絡上的所有其他帖子都提到了這種「不幸」和「不可能」的嘿嘿。謝謝!! –

1

我不得不爲一個項目最近做,但真正地沒有需要包括的時刻。JS,我採用的方法是手動分析的時候是這樣的:

function parseTime(time) {  
    let timeInt = parseInt(time); 
    let minutes = time.substring(3,5); 

    // you could then add or subtract time here as needed 

    if(time > '12:00') { 
     return `${timeInt - 12}:${minutes} PM`; 
    } else { 
     return `${timeInt}:${minutes} AM`; 
    } 
} 

使用此作爲替代啓動,如果你不想用的時刻。注意這個例子使用es6語法。