J'essaie d'obtenir la date à laquelle ToDate
aura une date antérieure et FromDate
aura la première date du mois en cours. Pour janvier, ce serait 1/1/2013
etc. Comment obtenir correctement la première date du mois en cours? Je ne suis pas capable de le faire.
today.add(Calendar.DAY_OF_MONTH, -1);
Java.util.Date previousDay=today.getTime();
ToDate = sdfFile1.format(newjava.sql.Date(previousDay.getTime()));
today.add(Calendar.DATE, 1);
Java.util.Date nextDay=today.getTime();
FromDate = sdfFile1.format(new Java.sql.Date(nextDay.getTime()));
essayer
Calendar c = Calendar.getInstance(); // this takes current date
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println(c.getTime()); // this returns Java.util.Date
Mis à jour ( Depuis Java 8 ):
import Java.time.LocalDate;
LocalDate todaydate = LocalDate.now();
System.out.println("Months first date in yyyy-mm-dd: " +todaydate.withDayOfMonth(1));
Comment obtenir correctement la première date du mois en cours?
LocalDate.now()
.with( TemporalAdjusters.firstDayOfMonth() )
Ou…
YearMonth.now().atDay( 1 )
Ou…
LocalDate.now().with ( ChronoField.DAY_OF_MONTH , 1 )
Le framework Java.time dans Java 8 et supérieur supplante les anciennes classes Java.util.Date/.Calendar. Les anciennes classes se sont avérées gênantes, déroutantes, et imparfaites, évitez-les.
Le framework Java.time est inspiré de la très réussie bibliothèque Joda-Time , définie par JSR 31 , étendue par le projet ThreeTen-Extra , et expliqué dans le Tutorial .
LocalDate
Pour une valeur de date uniquement, sans heure, utilisez la classe LocalDate
. Alors que LocalDate
n'a pas de fuseau horaire attribué, nous devons spécifier un fuseau horaire afin de déterminer une date telle que "aujourd'hui". Par exemple, un nouveau jour se lève plus tôt à Paris qu'à Montréal.
Le fuseau horaire est crucial pour déterminer la date d'aujourd'hui. Pour un moment donné, la date varie dans le monde entier par zone. L’omission du fuseau horaire signifie que le fuseau horaire actuel de la machine virtuelle est automatiquement appliqué pour déterminer la date actuelle. N'importe quel code de la machine virtuelle Java peut modifier la valeur par défaut au moment de l'exécution, vous êtes donc sur des sables mouvants. Il est préférable de spécifier explicitement votre fuseau horaire souhaité/attendu plutôt que de s’appuyer implicitement sur la valeur par défaut actuelle.
Spécifiez un nom de fuseau horaire correct au format continent/region
, tel que America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. N'utilisez jamais les abréviations de 3-4 lettres telles que EST
ou IST
telles qu'elles sont pas vrais fuseaux horaires, non standardisés, et même pas uniques (!) .
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );
Dump à la console.
System.out.println ( "For zoneId: " + zoneId + " today is: " + today + " and first of this month is " + firstOfCurrentMonth );
Pour zoneId: America/Montreal aujourd'hui: 2015-11-08 et premier de ce mois est 2015-11-01
Sinon, utilisez un TemporalAdjuster
. Pour vous aider, vous trouverez des implémentations pratiques dans la classe TemporalAdjusters
(note au pluriel s
), plus précisément firstDayOfMonth
.
LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
ZonedDateTime
Si vous avez besoin d’une heure de la journée, rappelez-vous que 00:00:00.000
est pas toujours le premier moment de la journée à cause de l'heure d'été (DST) et peut-être d'autres anomalies. Laissez donc Java.time déterminer l’heure exacte du premier moment de la journée.
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
2015-11-01T00: 00-04: 00 [Amérique/Montréal]
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien problème (ancien) hérité classes date-heure telles que Java.util.Date
, Calendar
, & SimpleDateFormat
.
Le projet Joda-Time , maintenant en mode de maintenance , conseille la migration vers les classes Java.time .
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .
Où obtenir les classes Java.time?
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval
, YearWeek
, YearQuarter
, et plus .
Calendar date = Calendar.getInstance();
date.set(Calendar.DAY_OF_MONTH, 1);
heure de Joda
Si je comprends bien la question, cela peut être fait très facilement en utilisant joda time
LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
public static String getCurrentMonthFirstDate(){
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
DateFormat df = new SimpleDateFormat("MM-dd-yyyy");
//System.out.println(df.format(c.getTime()));
return df.format(c.getTime());
}
Si vous souhaitez également que l'heure soit définie sur 0, le code est le suivant:
import Java.util.*;
import Java.text.*;
public class DateCalculations {
public static void main(String[] args) {
Calendar aCalendar = Calendar.getInstance();
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR_OF_DAY, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
Date firstDateOfCurrentMonth = aCalendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zZ");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String dayFirst = sdf.format(firstDateOfCurrentMonth);
System.out.println(dayFirst);
}
}
Vous pouvez vérifier en ligne facilement sans compilation en utilisant: http://www.browxy.com/