4
votes

Combien de temps unitaires (10 minutes, demi-heure) y a-t-il entre 2 heures locales? Java 8

Je veux définir une unité de temps par exemple, 12 minutes ou 25 minutes, pour savoir combien de temps unitaires il y a entre 2 LocalTime en Java.

Par exemple, si j'ai défini 15 minutes comme unité de temps, entre 8h00 et 10h00, je devrais obtenir 8 fois.


5 commentaires

LocalDate ne stocke que les dates, pas les heures, il n'y a donc pas "entre 8h00 et 10h00" lorsque vous utilisez LocalDate


SOrry est localTime


Avez-vous lu la documentation , c'est-à-dire le javadoc de LocalTime , pour voir s'il existe des méthodes qui peuvent vous aider? Qu'as-tu essayé? --- Astuce: voir jusqu'à


J'essaye ceci: ChronoUnit.MINUTES.between (start, end) mais le problème est que ChronoUnito n'a déjà défini que unitTime, mais j'ai besoin de spécifier mon propre temps unitaire.


«ChronoUnito n'a déjà défini que UnitTime», puis utilisez la multiplication et la division. Si vous avez X minutes entre 2 dates, alors vous avez X / 20 intervalles de "20 minutes".


3 Réponses :


6
votes

Vous pouvez utiliser la classe Duration pour obtenir la durée entre deux valeurs LocalTime. Ensuite, vous pouvez calculer vous-même les unités de temps personnalisées:

long millisUnit = TimeUnit.MINUTES.toMillis(15);
// ...
long unitsCount = duration.toMillis() / millisUnit;

Ceci imprime 8.

Si vous avez des unités de temps différentes, vous pouvez interrompre la durée jusqu'à millis et calculez le résultat:

int minutesUnit = 15;
LocalTime startTime = LocalTime.of(8, 0);
LocalTime endTime = LocalTime.of(10, 0);
Duration duration = Duration.between(startTime, endTime);
long unitsCount = duration.toMinutes() / minutesUnit;
System.out.println(unitsCount);


1 commentaires

ceci peut également être réalisé avec ChronoUnit.MINUTES.between que l'OP déjà utilisé



4
votes
    Duration unit = Duration.ofMinutes(15);

    LocalTime start = LocalTime.of(8, 0);
    LocalTime end = LocalTime.of(10, 0);

    long howMany = Duration.between(start, end).dividedBy(unit);

    System.out.println("" + howMany + " units");
Output:
  8 units
Since Java 9 Duration has had a dividedBy(Duration) method, just what you need here.The limitation is it gives you only whole units. Had the unit been 25 minutes, the result would be 4 (not 4.8) units.

0 commentaires

3
votes

Vous pouvez mettre en œuvre un TemporalUnit qui est basé sur un arbitraire (positif) Durée . Vous pouvez ensuite l'utiliser comme si vous utilisiez n'importe quel ChronoUnit , par exemple

public final class DurationUnit implements TemporalUnit {

    private static final int SECONDS_PER_DAY = 86400;
    private static final long NANOS_PER_SECOND =  1000_000_000L;
    private static final long NANOS_PER_DAY = NANOS_PER_SECOND * SECONDS_PER_DAY;

    private final Duration duration;

    public static DurationUnit of(Duration duration)   { return new DurationUnit(duration); }
    public static DurationUnit ofDays(long days)       { return new DurationUnit(Duration.ofDays(days)); }
    public static DurationUnit ofHours(long hours)     { return new DurationUnit(Duration.ofHours(hours)); }
    public static DurationUnit ofMinutes(long minutes) { return new DurationUnit(Duration.ofMinutes(minutes)); }
    public static DurationUnit ofSeconds(long seconds) { return new DurationUnit(Duration.ofSeconds(seconds)); }
    public static DurationUnit ofMillis(long millis)   { return new DurationUnit(Duration.ofMillis(millis)); }
    public static DurationUnit ofNanos(long nanos)     { return new DurationUnit(Duration.ofNanos(nanos)); }

    private DurationUnit(Duration duration) {
        if (duration.isZero() || duration.isNegative())
            throw new IllegalArgumentException("Duration may not be zero or negative");
        this.duration = duration;
    }

    @Override
    public Duration getDuration() {
        return this.duration;
    }

    @Override
    public boolean isDurationEstimated() {
        return (this.duration.getSeconds() >= SECONDS_PER_DAY);
    }

    @Override
    public boolean isDateBased() {
        return (this.duration.getNano() == 0 && this.duration.getSeconds() % SECONDS_PER_DAY == 0);
    }

    @Override
    public boolean isTimeBased() {
        return (this.duration.getSeconds() < SECONDS_PER_DAY && NANOS_PER_DAY % this.duration.toNanos() == 0);
    }

    @Override
    @SuppressWarnings("unchecked")
    public <R extends Temporal> R addTo(R temporal, long amount) {
        return (R) this.duration.multipliedBy(amount).addTo(temporal);
    }

    @Override
    public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive) {
        return Duration.between(temporal1Inclusive, temporal2Exclusive).dividedBy(this.duration);
    }

    @Override
    public String toString() {
        return this.duration.toString();
    }

}
DurationUnit min7 = DurationUnit.ofMinutes(7);
System.out.println(min7.between(start, end)); // prints: 17
System.out.println(start.until(end, min7));   // prints: 17
System.out.println(start.plus(3, min7));      // prints: 08:21

TemporalUnit personnalisé:

XXX


0 commentaires