web-dev-qa-db-fra.com

Comment obtenir la plage de date/heure pour "aujourd'hui" à l'aide de la bibliothèque de date/heure Joda en Java?

En supposant que vous obteniez l'heure actuelle dans heure de Joda :

DateTime now = new DateTime();

Comment calculez-vous les valeurs pour les variables dateTimeAtStartOfToday et dateTimeAtEndOfToday?

Ce que j'essaie de faire, c'est générer du SQL pour faire une recherche de toutes les transactions qui ont eu lieu entre les startOfToday et endOfToday.

21
Morris

J'utiliserais:

LocalDate today = now.toLocalDate();
LocalDate tomorrow = today.plusDays(1);

DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone());
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone());

Ensuite, vérifiez si startOfToday <= time < startOfTomorrow pour une heure donnée.

Bien sûr, cela dépend en partie de ce qui est stocké dans la base de données et du fuseau horaire qui vous intéresse.

35
Jon Skeet

Cela fonctionne mieux, il s'avère que DateTime a une méthode appelée toInterval qui effectue exactement cette opération (calcule de minuit à minuit). Dans mes tests, il semble ne pas avoir de problème avec les transitions DST.

DateTime now = new DateTime();
DateTime startOfToday = now.toDateMidnight().toInterval().getStart();
DateTime endOfToday = now.toDateMidnight().toInterval().getEnd();
System.out.println( "\n" + now + "\n" + startOfToday + "\n" + endOfToday + "\n" );

JODA a l'air d'être très bien pensé.

5
Bob Kuhar
if((sinceDate.getDayOfYear() == now.getDayOfYear())  && (sinceDate.year() == now.year()))
   //yep, do something today;

travaille pour moi. 

1
Prakash Nadar
import org.joda.time.DateTime;
import org.joda.time.DateTimeMidnight;

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight());  
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1));
0
Eric Normand

En tant que fonction d'extension Kotlin, elle ressemble à ceci:

fun DateTime.isOnSameDay(timeOnDayToCheck: DateTime) =
  timeOnDayToCheck.toLocalDate().toInterval(this.zone).contains(this)

Cela ne contient pas d'heures égales à end du jour (le début est inclus), alors ajoutez peut-être un "ou" -case avec interval.getEnd().isEqual(this)).

0
hardysim

Cela marche...

DateTime dt = new DateTime();
DateMidnight dtStartDate = dt.toDateMidnight();
DateMidnight dtEndDate = dt.plusDays( 1 ).toDateMidnight();
System.out.println( dt + "\n" + dtStartDate + "\n" + dtEndDate );

... mais en ce qui concerne le code SQL, j'ai tendance à utiliser BETWEEN comme clause where plutôt que de faire les trucs> et <=

0
Bob Kuhar