J'essaie d'ajouter des heures au format 24 heures, par exemple "23: 59: 59". Je dois ajouter, par exemple, 2,5 heures pour que le temps passe au jour suivant et soit affiché comme «02: 30: 00».
Ce que j'ai essayé jusqu'à présent fonctionne jusqu'à ce qu'il atteigne 23: 59: 59 ». Je dois montrer l'heure du jour suivant si elle dépasse «23: 59: 59». Voici ce que j'ai essayé jusqu'à présent:
var time = $('#starttime').val().split(':');
var d = new Date();
d.setHours(+time[0]);
d.setMinutes(time[1]);
d.setSeconds(time[2]);
var time2 = $('#endtime').val().split(':');
var endtimeval = new Date();
endtimeval.setHours(+time2[0]);
endtimeval.setMinutes(time2[1]);
endtimeval.setSeconds(time2[2]);
var str = d.getHours() + parseInt($('#noofhours').val()) + ":" + time2[1] + ":" + time2[2];
$('#endtime').val(str);
4 Réponses :
L'utilisation d'un objet date ici est peut-être inutile, l'arithmétique modulo devrait suffire.
const pad = n => {
const s = String(n);
return s.length > 1 ? s : '0' + s;
};
const addHours = (timeVal, numHours) => {
const [hr, min, sec] = timeVal.split(':').map(Number);
const [,lefty, righty] = String(numHours).match(/(\d+)(?:(\.\d+))?/).map(Number);
const hours = (hr + lefty) % 24;
const minutes = righty === undefined ?
min :
((righty * 60 | 0) + min) % 60;
return [hours, minutes, sec].map(pad).join(':');
};
addHours('23:59:59', 2.5) // "01:29:59"
Notez que comme il n'y a pas de dates impliquées, il ne traitera pas avec précision, par exemple. le temps de l'heure d'été. Notez également que dans cet exemple, les minutes sont arrondies vers le bas, vous pouvez répéter la logique pour les secondes si vous le souhaitez.
Notez que votre approche utilisant des objets Date donnera des réponses différentes pour les mêmes entrées selon le moment / l'endroit où la logique s'exécute, pour les mêmes raisons.
Créer un additionneur de date personnalisé?
const add = (time, hours) => {
let [hh, mm, ss] = time.split(':');
const seconds = hours * 60 * 60;
ss = ss * 1 + seconds;
if (ss >= 60) {
mm = mm * 1 + ss / 60;
ss = (ss % 60).toPrecision(2).padStart(2, '0');
}
if (mm >= 60) {
hh = hh * 1 + mm / 60;
mm = (mm % 60).toPrecision(2).padStart(2, '0');
}
hh = (Math.floor(hh) % 24).toString().padStart(2, '0');
return hh + ':' + mm + ':' + ss;
}
console.log(add("23:59:59", 2.5));
vous pouvez appliquer le principe DRY et refactoriser le code vous-même. Mais il fera le travail selon vos besoins.
À part quelques différences superficielles, en quoi est-ce différent de l'approche de ma réponse?
Vous pouvez utiliser assez facilement les méthodes JavaScript Date vanille ici. La plupart du travail consiste à analyser les entrées de la chaîne de temps, puis à concaténer la sortie de la chaîne de temps. Par exemple:
let start = '23:59:59';
let add = '2.5';
let [hh, mm, ss] = start.split(':').map(x => parseInt(x));
let d = new Date(new Date().setHours(hh, mm + (add * 60), ss));
let end = `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
console.log(end);
// 2:29:59
@SPYder - J'ai lu les commentaires mais pas clair pour moi ce que vous pensez que je verrais là-bas qui changerait la réponse. N'hésitez pas à élaborer.
Notez que votre approche utilisant des objets Date donnera des réponses différentes pour les mêmes entrées en fonction du moment / où la logique s'exécute.
@JaredSmith, merci pour votre commentaire. Mais cette logique fonctionne selon le fuseau horaire, c'est ce dont j'avais besoin.
@benvc, le temps compris en heures, cela peut être une valeur flottante comme 2,3, qui doit être ajoutée avec la chaîne au format 24 heures comme «HH: MM: SS», dites «23: 59: 59». C'est la chose que je dois faire et la même chose que j'ai expliqué ci-dessus.
@SPYder - Sauf si je vous comprends mal, la réponse ci-dessus gère les valeurs flottantes et les convertit en minutes pour l'ajout. Exécutez l'extrait et vous verrez ce que je veux dire.
@JaredSmith - vous avez absolument raison. Si vous ne souhaitez pas que cela tienne compte de l'heure d'été locale, vous pouvez le modifier à l'aide des différentes méthodes JavaScript Date UTC, ou si l'entrée d'heure est relative à une autre date dans les paramètres régionaux, vous devrez modifier la création de l'objet de date. .
@SPYder c'est cool, mais vous devriez vraiment mettre cela dans la question elle-même.
L'astuce simple que j'ai faite est de convertir simplement les heures saisies en float / int en une valeur minute en multipliant par 60 et en créant une date, en ajoutant simplement le temps dont je dispose déjà. Voici la solution avec des étapes minimales:
var time = $('#endtime').val().split(':');
var d = new Date();
d.setHours(+time[0]);
d.setMinutes(time[1]);
d.setSeconds(time[2]);
var addeddate = new Date();
addeddate.setMinutes(parseFloat($('#noofhours').val()) * 60);
$('#endtime').val(("0" + (addeddate.getHours())).slice(-2) + ":" + ("0" + (addeddate.getMinutes())).slice(-2) + ":" + ("0" + (addeddate.getSeconds())).slice(-2)); //The answer that I needed in endtime id value.
Notez que votre approche utilisant des objets Date donnera des réponses différentes pour les mêmes entrées en fonction du moment / où la logique s'exécute
Au lieu de faire des choses comme ça à la main, il vaut peut-être la peine d'examiner les options de bibliothèque comme date-fns a > par exemple
+1 pour le commentaire @raphinesse. J'utilise Moment.js et cela facilite tout ce type de choses, et vous serez moins susceptible d'avoir des erreurs ou des cas extrêmes sur la route
Pourriez-vous s'il vous plaît m'aider à faire de même en javascript brut? . Je ne suis pas en mesure d'utiliser des fichiers js et des CDN tiers. J'espère que vous avez compris.
Veuillez au moins créer un exemple minimal reproductible de votre code. À l'heure actuelle, par exemple, je n'ai aucune idée de l'endroit exact où ces 2,5 heures dont vous parlez sont censées se cacher.
De plus, ajouter 2,5 heures devrait vous amener à
02:28:59, non? Ou parlez-vous d'une constellation spéciale autour des dates où le passage entre l'heure d'été et l'heure d'hiver se produit?@ 04FS, je l'ai expliqué clairement maintenant, veuillez y regarder.
Le principal problème ici est que vous ne laissez pas l'objet Date lui-même gérer l'ajout d'heures (il peut le faire assez bien et gère les débordements automatiquement), mais que vous effectuez vos propres calculs ici avec
var str = d. getHours () + parseInt (...)- vous êtes dans notre système décimal normal ici, vous ne pouvez donc pas vous attendre à ce que cela gère seul les débordements sur plus de 24 heures ou 60 minutes. stackoverflow.com/questions/563406/add-days-to -javascript-da te explique le principe de base que vous devez utiliser ici.(Bien que setHours puisse ne pas gérer correctement une valeur telle que 2,5 - il peut donc être plus facile d'utiliser la méthode pour définir les minutes à la place, avec 2,5 * 60 comme valeur.)
+1 et plus pour le point clé @ 04FS, j'ai créé un code simple et utile s'il vous plaît regardez dans la réponse..Merci pour votre précieux point.