J'essaie d'obtenir la première date et la dernière date du mois et de l'année donnés. J'ai utilisé le code suivant pour obtenir la dernière date au format aaaaMMjj. Mais ne pouvait pas obtenir ce format. Aussi, je veux que la date de début soit dans le même format. Je travaille toujours sur ceci. Quelqu'un peut-il m'aider à réparer le code ci-dessous?
public static Java.util.Date calculateMonthEndDate(int month, int year) {
int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = daysInAMonth[month];
boolean isLeapYear = new GregorianCalendar().isLeapYear(year);
if (isLeapYear && month == 2) {
day++;
}
GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
Java.util.Date monthEndDate = new Java.util.Date(gc.getTime().getTime());
return monthEndDate;
}
public static void main(String[] args) {
int month = 3;
int year = 2076;
final Java.util.Date calculatedDate = calculateMonthEndDate(month, year);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.format(calculatedDate);
System.out.println("Calculated month end date : " + calculatedDate);
}
Pour obtenir la Date de début
GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
Java.util.Date monthEndDate = new Java.util.Date(gc.getTime().getTime());
System.out.println(monthEndDate);
(Remarque: dans la date de début le jour = 1)
pour le formaté
SimpleDateFormat format = new SimpleDateFormat(/////////add your format here);
System.out.println("Calculated month end date : " + format.format(calculatedDate));
Java.time.YearMonth
Le nouveau framework Java.time sous Java 8 ( Didacticiel _) dispose de commandes à cet effet.
La classe bien nommée YearMonth
représente un mois de l'année, sans jour ni heure spécifiques. De là, nous pouvons demander les premiers jours du mois.
YearMonth yearMonth = YearMonth.of( 2015, 1 ); // January of 2015.
LocalDate firstOfMonth = yearMonth.atDay( 1 );
LocalDate last = yearMonth.atEndOfMonth();
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode { mode maintenance }, conseille la migration vers les classes Java.time .
Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.*
classes.
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 y trouver des classes utiles telles que Interval
_, YearWeek
, YearQuarter
_ et plus _.
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.format(calculatedDate);
System.out.println("Calculated month end date : " + calculatedDate);
Le changer en
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String formattedDate = format.format(calculatedDate);
System.out.println("Calculated month end date : " + formattedDate);
Pour plus de détail
http://docs.Oracle.com/javase/1.5.0/docs/api/Java/text/DateFormat.html#format(Java.util.Date )
Une autre approche
package com.shashi.mpoole;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;
import Java.util.Date;
import Java.util.GregorianCalendar;
public class DateMagic {
public static String PATTERN = "yyyyMMdd";
static class Measure
{
private int month;
private int year;
private Calendar calendar;
public Measure() {
// TODO Auto-generated constructor stub
init();
}
private void init() {
// TODO Auto-generated method stub
calendar = Calendar.getInstance();
calendar.set(year, month, 1);
}
public String min()
{
return format(calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
}
public String max()
{
return format(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
}
private Date date(GregorianCalendar c)
{
return new Java.util.Date(c.getTime().getTime());
}
private GregorianCalendar gc(int day)
{
return new GregorianCalendar(year, month, day);
}
private String format(int day) {
SimpleDateFormat format = new SimpleDateFormat(PATTERN);
return format.format(date(gc(day)));
}
public Measure month(int month) {
// TODO Auto-generated method stub
this.month = month -1 ;
return this;
}
public Measure year(int year) {
// TODO Auto-generated method stub
this.year = year;
return this;
}
}
public static void main(String[] args) {
Measure measure = new Measure().month(3).year(2076);
System.out.println(measure.max());
System.out.println(measure.min());
}
}
Vous pouvez simplement utiliser la classe Calendar. vous devriez assigner la variable mois quel mois vous voulez
Calendar gc = new GregorianCalendar();
gc.set(Calendar.MONTH, month);
gc.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = gc.getTime();
gc.add(Calendar.MONTH, 1);
gc.add(Calendar.DAY_OF_MONTH, -1);
Date monthEnd = gc.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
System.out.println("Calculated month start date : " + format.format(monthStart));
System.out.println("Calculated month end date : " + format.format(monthEnd));
Premier jour:
Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
Dernier jour du mois:
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
Essayez le code ci-dessous pour le dernier jour du mois: -
Calendar c = Calendar.getInstance();
c.set(2012,3,1); //------>
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(sdf.format(c.getTime()));
GregorianCalendar gc = new GregorianCalendar(year, selectedMonth-1, 1);
Java.util.Date monthStartDate = new Java.util.Date(gc.getTime().getTime());
Calendar calendar = Calendar.getInstance();
calendar.setTime(monthStartDate);
calendar.add(calendar.MONTH, 1);
calendar.add(calendar.DAY_OF_MONTH, -1);
Java.util.Date monthEndDate = new Java.util.Date(calendar.getTime())
Bien que, pas exactement la réponse à la question OP, les méthodes ci-dessous donneront mois en cours première et dernière dates en tant qu'instances Java 8+ LocalDate.
public static LocalDate getCurrentMonthFirstDate() {
return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);
}
public static LocalDate getCurrentMonthLastDate() {
return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);
}
Note latérale: L'utilisation de LocalDate.ofEpochDay(...)
au lieu de LocalDate.now()
améliore considérablement les performances. En outre, l'utilisation de l'expression millis-en-un-jour au lieu de la valeur finale, qui correspond à 86400000
, donne de meilleurs résultats. Au départ, je pensais que ce dernier serait plus performant que l'expression: P
Pourquoi cette réponse : Ce n’est pourtant pas une réponse correcte pour la question OP, mais je réponds toujours ici car Google a montré cette question lorsque j’ai cherché 'Java 8 get month start date' :)
public static Date[] getMonthInterval(Date data) throws Exception {
Date[] dates = new Date[2];
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.setTime(data);
start.set(Calendar.DAY_OF_MONTH, start.getActualMinimum(Calendar.DAY_OF_MONTH));
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
end.setTime(data);
end.set(Calendar.DAY_OF_MONTH, end.getActualMaximum(Calendar.DAY_OF_MONTH));
end.set(Calendar.HOUR_OF_DAY, 23);
end.set(Calendar.MINUTE, 59);
end.set(Calendar.SECOND, 59);
//System.out.println("start "+ start.getTime());
//System.out.println("end "+ end.getTime());
dates[0] = start.getTime();
dates[1] = end.getTime();
return dates;
}