Ich versuche das erste Datum und das letzte Datum des angegebenen Monats und Jahres zu erhalten. Ich habe folgenden Code verwendet, um das letzte Datum im Format yyyyMMdd zu erhalten. Aber konnte dieses Format nicht bekommen. Auch dann möchte ich das Startdatum im selben Format haben. Ich arbeite noch daran. Kann mir jemand bei der Korrektur des untenstehenden Codes helfen?
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);
}
Um das Startdatum zu erhalten
GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
Java.util.Date monthEndDate = new Java.util.Date(gc.getTime().getTime());
System.out.println(monthEndDate);
(Note: im Startdatum der Tag = 1)
für die formatierten
SimpleDateFormat format = new SimpleDateFormat(/////////add your format here);
System.out.println("Calculated month end date : " + format.format(calculatedDate));
Java.time.YearMonth
Das neue Java.time Framework in Java 8 ( Tutorial ) enthält hierfür Befehle.
Die entsprechend benannte Klasse YearMonth
repräsentiert einen Monat eines Jahres ohne einen bestimmten Tag oder eine bestimmte Uhrzeit. Von dort können wir den ersten Tag und die Tage des Monats anfordern.
YearMonth yearMonth = YearMonth.of( 2015, 1 ); // January of 2015.
LocalDate firstOfMonth = yearMonth.atDay( 1 );
LocalDate last = yearMonth.atEndOfMonth();
Das Framework Java.time ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Legacy Datum-Uhrzeit-Klassen, wie Java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Projekt Joda-Time , das sich jetzt im Wartungsmodus befindet, empfiehlt die Migration zu den Klassen Java.time .
Weitere Informationen finden Sie unter Oracle Tutorial . Durchsuchen Sie den Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können Java.time - Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der mit JDBC 4.2 oder höher kompatibel ist. Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für Java.sql.*
-Klassen.
Wo erhalten Sie die Java.time-Klassen?
Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie nützliche Klassen wie Interval
, YearWeek
, YearQuarter
und mehr .
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.format(calculatedDate);
System.out.println("Calculated month end date : " + calculatedDate);
Ändern Sie es in
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String formattedDate = format.format(calculatedDate);
System.out.println("Calculated month end date : " + formattedDate);
Für mehr Details
http://docs.Oracle.com/javase/1.5.0/docs/api/Java/text/DateFormat.html#format(Java.util.Date )
Ein anderer Ansatz
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());
}
}
Sie können einfach die Kalender-Klasse verwenden. Sie sollten Monatvariable den Monat zuweisen, den Sie möchten
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));
Erster Tag:
Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
Letzter Tag des Monats:
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
Versuchen Sie den Code für den letzten Tag des Monats unter: -
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())
Obwohl dies nicht genau die Antwort auf die OP-Frage ist, werden die folgenden Methoden angegeben: aktueller Monat erstes und letztes Datum als Java 8+ LocalDate-Instanzen).
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);
}
Randnotiz: Durch die Verwendung von LocalDate.ofEpochDay(...)
anstelle von LocalDate.now()
wird die Leistung erheblich verbessert. Auch die Verwendung des Millis-in-a-Day-Ausdrucks anstelle des Endwerts 86400000
Ist leistungsfähiger. Ich dachte anfangs, letzteres würde besser abschneiden als der Ausdruck: P
Warum diese Antwort?: Dies ist immer noch keine korrekte Antwort auf die OP-Frage, aber ich beantworte sie hier immer noch, da Google diese Frage angezeigt hat, als ich nach 'Java 8 get' gesucht habe Monatsbeginn ':)
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;
}