web-dev-qa-db-fra.com

Obtenir la première date du mois en cours en java

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()));
42
user959883

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));
78
Evgeniy Dorofeev

tl; dr

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 )

Java.time

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]


À propos de Java.time

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 .

17
Basil Bourque
Calendar date = Calendar.getInstance();
date.set(Calendar.DAY_OF_MONTH, 1);
7
partlov

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);
2
ankit.vishen

Fonctionne comme un charme!

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());
}

// Correction: output = 02-01-2018 enter image description here

1
Debasish Ghosh

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/

1
efirat