2013-07-26 8 views
25

Ho bisogno di analizzare e manipolare i tempi senza date nel mio codice. Per esempio potrei ottenere la stringa "15:00" da un timepicker. Voglio trasformarlo in un oggetto temporale di qualche tipo - normalmente lavoro in Python che ha oggetti distinti di data, ora e datetime.parsing Javascript Times senza data

Tuttavia, tutte le soluzioni che ho visto si concentrano sull'utilizzo dell'oggetto Date. Questo non può analizzare una stringa come "15:00" poiché richiede informazioni sul giorno. Non voglio aggiungere informazioni sulla data arbitrarie a Times - soprattutto perché Data sembra fare supposizioni su cose come l'ora legale a seconda del giorno e delle impostazioni locali, e sembra esserci il rischio che tenti automaticamente di tradurre il tempo in un dato locale. Inoltre voglio essere in grado di aggiungere tempi, ad es. "15:00 + 1 ora"

Qual è la soluzione consigliata per analizzare e gestire i tempi "non elaborati" non associati alle date?

+0

Se non si desidera scrivere il proprio codice per farlo, non c'è [Moment.js] (http://momentjs.com) o [Date.js] (http://www.datejs.com) . – Pointy

+0

Consiglierei di scrivere da solo le poche righe necessarie. Dato che non c'è preoccupazione per il calendario, è semplice. –

+0

Questo è quello che speravo di evitare. Moment.js e Date.js si concentrano entrambi su DateTimes, non su Times, quindi devi ancora incollare le informazioni sulla data arbitraria prima che tu possa usarle. Posso immaginare che non sia fondamentalmente complicato da implementare, ma sono sorpreso che questo non esiste già. La data – mangecoeur

risposta

13

Sfortunatamente, non c'è una soluzione eccezionale. JavaScript ha solo un oggetto Date, che è probabilmente chiamato in causa perché è davvero una data + ora.

Una cosa che si potrebbe desiderare di pensare più in profondità - si dice che si desidera lavorare con solo il tempo, ma vuoi dire un ora del giorno O vuoi dire una durata di tempo ? Questi sono due concetti correlati, ma leggermente diversi.

Ad esempio, hai detto che potresti volere un'operazione come "15:00 + 1 ora". Beh, in ogni caso sarebbero chiaramente le 16:00. Ma per quanto riguarda "15:00 + 10 ore"? Sarebbe 25:00 se si parla di una durata, ma potrebbe essere 01:00 se si parla di ora del giorno.

In realtà, potrebbe non essere 01:00, poiché non tutti i giorni hanno 24 ore in loro. Alcuni giorni hanno 23, 23,5, 24,5 o 25 ore, a seconda del fuso orario e se il DST inizia o si interrompe in quel giorno. Pertanto, nel contesto dell'ora del giorno, probabilmente do si desidera includere una data e una zona particolari nel calcolo. Naturalmente, se si parla di giorni di 24 ore, questo punto è irrilevante.

Se si sta parlando di durate - si potrebbe desiderare di rivedere moment.js, ma non l'oggetto moment. C'è un altro oggetto, moment.duration. Il riferimento è here.

Infine, è possibile prendere in considerazione solo l'utilizzo di un semplice javascript per analizzare ore e minuti dalla stringa del tempo come numeri. Manipolare i numeri secondo necessità e quindi emettere nuovamente una stringa. Ma la tua domanda sembra che tu stia cercando qualcosa di più gestito.

+0

Purtroppo sto cercando "Ora del giorno" piuttosto che la durata (quindi moment.js è fuori). Sembra che non ci sia una soluzione gestita e devo usare l'analisi delle stringhe regex - il che è un peccato perché è il tipo di roba poco incline a bug sottili che preferisco aver gestito da una libreria ben testata. – mangecoeur

+0

Se è possibile posizionare quell'ora in un particolare giorno, quindi 'Data' o' momento' sarebbe comunque una buona idea. Se è sempre staccato (come le ore in cui un ristorante è aperto ogni giorno della settimana) i casi limite sono molto più impegnativi. Non conosco nessuna buona libreria js per questo. scusa. –

14

ho finito per usare il seguente dato che ero già utilizzando moment nella mia app:

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

Vedere Moment String+Format docs per le altre stringhe di formato che è possibile utilizzare.

29

Ecco una soluzione moment.js per 12 o 24 ore orari:

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

Ho cercato per tutto il giorno –

+0

Wow ... questo è esattamente esso! Fondamentalmente la data dell'ora del giorno non ha importanza per il mio caso d'uso (e forse anche per l'OP). Serve solo a convertire una stringa temporale in un oggetto momentjs valido. E pensare che tutti gli altri post sul web parlano di "sfortuna" e "impossibile" hehe. Grazie!! –

1

ho dovuto fare questo di recente per un progetto sbagliando di poco davvero bisogno di includere momento.js, il metodo che ho usato è stato quello di analizzare manualmente il momento come questo:

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`; 
    } 
} 

Utilizzare questo come antipasto alternativa se non si desidera utilizzare momento. Nota questo esempio usa la sintassi es6.