Pour ceux qui viennent ici à la recherche de la réponse à "js-joda", vous avez deux options en fonction de ce que vous cherchez à accomplir
Option 1 : Vous voulez que le début de la journée soit dans le même fuseau horaire.
Puisque vous avez choisi de calculer vos heures sur la base d'un instant par rapport à un fuseau horaire, vous devez utiliser ZonedDateTime :
import { ZonedDateTime, LocalDate, ZoneId, DateTimeFormatter} from "js-joda";
import 'js-joda-timezone';
const nowInNewYorkCity = ZonedDateTime.now(ZoneId.of("America/New_York"))
const startOfTodayInNYC = nowInNewYorkCity.truncatedTo(ChronoUnit.DAYS);
console.log(startOfTodayInNYC.toString()) // Prints "2019-04-15T00:00-04:00[America/New_York]"
// And if you want to print it in ISO format
console.log(startOfTodayInNYC.format(DateTimeFormatter.ISO_INSTANT)) // "2019-04-14T04:00:00Z"
Option 2 : Vous connaissez le jour exact pour lequel vous souhaitez obtenir l'heure.
Vous pouvez ensuite utiliser les méthodes suivantes à partir de LocalDate pour obtenir l'heure relative (c'est-à-dire ZonedDateTime) que vous souhaitez :
atStartOfDay(): LocalDateTime
atStartOfDay(zone: ZoneId): ZonedDateTime
atStartOfDayWithZone(zone: ZoneId): ZonedDateTime
Option 3 : Je veux seulement le jour où l'instant s'est produit.
Remarquez qu'avec ce code, vous obtenez le jour qui correspond à l'endroit où vous vous trouvez. Ainsi, pour les habitants de New York, il s'agit de "2019-04-14" et pour ceux de Londres, il s'agit de "2019-04-15" (ce qui est génial !) parce que l'instant dans le temps se situe dans la période où il s'agit effectivement de demain à Londres ("2019-04-15T00:00:05Z"). Imaginez que vous appelez quelqu'un à Londres depuis New York, et que le Londonien vous dise : "Bon sang, pourquoi m'appelez-vous si tôt... il est minuit passé de 5 secondes".
import { ZonedDateTime, LocalDate, ZoneId} from "js-joda";
import 'js-joda-timezone';
const aTimeWhenLondonIsAlreadyInTomorrow = "2019-04-15T00:00:05.000Z";
const inBetweenTimeInLondon = ZonedDateTime.parse(aTimeWhenLondonIsAlreadyInTomorrow);
const inBetweenTimeInNYC = inBetweenTimeInLondon.withZoneSameInstant(ZoneId.of("America/New_York"))
const dayInLondon = inBetweenTimeInLondon.toLocalDate();
const dayInNYC = inBetweenTimeInNYC.toLocalDate();
console.log(inBetweenTimeInLondon.toString()); // "2019-04-15T00:00:05Z"
console.log(dayInLondon.toString()); // "2019-04-15"
console.log(inBetweenTimeInNYC.toString()) // "2019-04-14T20:00:05-04:00[America/New_York]"
console.log(dayInNYC.toString()); // "2019-04-14"
Références : https://js-joda.github.io/js-joda/class/src/LocalDate.js~LocalDate.html#instance-method-atStartOfDayWithZone
1 votes
C'est toujours un très mauvaise idée de soustraire une "petite unité" à la fin des intervalles de temps. Les intervalles de temps ont leur début inclus et leur fin exclue. Pour vérifier si une (date)heure est incluse dans l'intervalle, il faut faire : start <= time && time < end. Sinon, vous vous retrouvez avec une petite quantité de valeurs (effectivement dans l'intervalle) qui sont soudainement exclues. Pensez à la dernière seconde dans votre cas. 23:59:59.5 n'est pas dans cet intervalle. L'utilisation de petites unités permet simplement de réduire le nombre de valeurs exclues, mais ne supprime pas le problème. L'utilisation de la bonne comparaison le fait.