web-dev-qa-db-fra.com

Temps d'analyse Javascript sans date

J'ai besoin d'analyser et de manipuler les temps sans dates dans mon code. Par exemple, je pourrais obtenir la chaîne "15:00" d'un timepicker. Je veux transformer cela en un objet Time d'une certaine sorte - je travaille normalement dans Python qui a des objets Date, Time et Datetime distincts.

Cependant, toutes les solutions que j'ai vues se concentrent sur l'utilisation de l'objet Date. Cela ne peut pas analyser une chaîne comme "15:00" car elle nécessite des informations de jour. Je ne veux pas ajouter des informations de date arbitraires à Times - d'autant plus que Date semble faire des suppositions sur des choses comme l'heure d'été en fonction du jour et des paramètres régionaux, et il semble y avoir un risque qu'il essaie automatiquement de traduire l'heure en un paramètres régionaux donnés. De plus, je veux pouvoir ajouter des temps, par ex. "15h00 + 1 heure"

Quelle est la solution recommandée pour analyser et gérer les heures "brutes" non associées aux dates?

43
mangecoeur

Malheureusement, il n'y a pas de bonne solution. JavaScript n'a qu'un objet Date, qui est probablement mal nommé car il s'agit vraiment d'une date + heure.

Une chose à laquelle vous voudrez peut-être réfléchir plus profondément - vous dites que vous ne voulez travailler qu'avec du temps, mais voulez-vous dire une heure de la journée ou voulez-vous dire une durée de fois? Ce sont deux concepts liés, mais légèrement différents.

Par exemple, vous avez dit que vous souhaitiez peut-être une opération comme "15:00 + 1 heure". Eh bien, ce serait clairement 16h00 de toute façon. Mais qu'en est-il de "15h00 + 10 heures"? Il serait 25h00 si vous parlez d'une durée, mais il pourrait être 01h00 si vous parlez de l'heure de la journée.

En fait, cela pourrait pas être 01:00, car tous les jours n'ont pas 24 heures. Certains jours ont 23, 23,5, 24,5 ou 25 heures, selon le fuseau horaire et si l'heure d'été commence ou s'arrête ce jour-là. Donc, dans le contexte de l'heure, vous devez probablement faire vouloir inclure une date et une zone particulières dans votre calcul. Bien sûr, si vous parlez de journées de 24 heures d'affilée, ce point n'est pas pertinent.

Si vous parlez de durées - vous voudrez peut-être revoir moment.js , mais pas l'objet moment. Il y a un autre objet là-bas, moment.duration. La référence est ici .

Et enfin, vous voudrez peut-être envisager d'utiliser simplement du javascript pour analyser les heures et les minutes de la chaîne de temps sous forme de nombres. Manipulez les nombres selon les besoins, puis sortez à nouveau une chaîne. Mais votre question semble être que vous cherchez quelque chose de mieux géré.

16
Matt Johnson-Pint

Voici une solution moment.js pour 12 ou 24 heures:

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/

61
Michael Cole

J'ai fini par utiliser les éléments suivants car j'utilisais déjà moment dans mon application:

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

Voir Moment String + Format docs pour les autres chaînes de format que vous pouvez utiliser.

17
MindJuice

J'ai dû le faire récemment pour un projet, mais je n'avais pas vraiment besoin d'inclure moment.js, la méthode que j'ai utilisée était d'analyser manuellement l'heure comme ceci:

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

Utilisez-le comme démarreur alternatif si vous ne voulez pas utiliser le moment. Notez que cet exemple utilise la syntaxe es6.

1
rhysclay