2013-01-23 11 views
6

Próbuję uzyskać pierwszą datę i ostatnią datę danego miesiąca i roku. Użyłem następującego kodu, aby uzyskać ostatnią datę w formacie rrrrMMdd. Ale nie mógł dostać tego formatu. Również wtedy chcę datę rozpoczęcia w tym samym formacie. Nadal nad tym pracuję. Czy ktoś może mi pomóc w ustalaniu poniższego kodu.java otrzymam pierwszą datę i ostatnią datę danego miesiąca oraz dany rok

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); 
} 
+4

Dobrze Jakie wyniki są * * otrzymujesz? I dlaczego dokonujesz konwersji z 'Date' (wyniku' Calendar.getTime() 'na' long', a następnie tworzenie nowego 'Date')? Czy możesz przełączyć się na używanie Joda Time, co sprawi, że wszystko będzie o wiele starsze? –

+1

możliwy duplikat [Jak uzyskać pierwszą datę i ostatnią datę poprzedniego miesiąca? (Java)] (http://stackoverflow.com/questions/10828398/how-to-get-the-first-date-and-last-date-t--previous-month-java) –

Odpowiedz

3

Aby uzyskać Data Rozpocznij

GregorianCalendar gc = new GregorianCalendar(year, month-1, 1); 
    java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime()); 
    System.out.println(monthEndDate); 

(Uwaga: W polu Rozpocznij Dotąd dni = 1)

na sformatowanym

SimpleDateFormat format = new SimpleDateFormat(/////////add your format here); 
System.out.println("Calculated month end date : " + format.format(calculatedDate)); 
5
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
format.format(calculatedDate); 
System.out.println("Calculated month end date : " + calculatedDate); 

Zmień go

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
String formattedDate = format.format(calculatedDate); 
System.out.println("Calculated month end date : " + formattedDate); 

Więcej szczegółów

http://docs.oracle.com/javase/1.5.0/docs/api/java/text/DateFormat.html#format(java.util.Date)

Innym podejściem

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


} 
4

Spróbuj poniżej kod ostatniego dnia miesiąca: -

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

http://www.coderanch.com/t/385759/java/java/date-date-month

1
 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()) 
+2

Twoja odpowiedź powinna zawierać wyjaśnienie kodu i opis sposobu rozwiązania problemu. – AbcAeffchen

3

prostu można użyć klasy Kalendarz. należy przypisać zmienną miesiąc, który miesiąc chcesz

 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)); 
1

choć nie dokładnie odpowiedź na pytanie OP, poniżej metody będą podane bieżący miesiąc pierwsze & ostatnich terminach przypadkach 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); 
} 

Notatka: Używanie LocalDate.ofEpochDay(...) zamiast LocalDate.now() daje dużo lepsze wyniki. Również używanie wyrażenia millis-in-day zamiast wartości końcowej, która jest 86400000, działa lepiej. I początkowo myślałem że ostatnia będzie działać lepiej niż wyrażeniem: P

Dlaczego ta odpowiedź: Mimo to nie jest poprawna odpowiedź dla PO pytanie, ale ja m wciąż odpowiadając tutaj jak Google pokazał to pytanie kiedy Wyniki dla 'java 8 zdobyć daty miesięcy start' :)

6

java.time.YearMonth

nowy java.time framework w Java 8 (Tutorial) ma do tego polecenia.

Potocznie nazwana klasa YearMonth reprezentuje miesiąc w roku, bez określonego dnia ani godziny. Stamtąd możemy poprosić o pierwsze i dni miesiąca.

YearMonth yearMonth = YearMonth.of(2015, 1); // January of 2015. 
LocalDate firstOfMonth = yearMonth.atDay(1); 
LocalDate last = yearMonth.atEndOfMonth(); 

O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Gdzie można uzyskać lekcje java.time?

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.

2

Pierwszy dzień:

Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH); 

Ostatni dzień miesiąca:

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH); 
Powiązane problemy