2013-01-23 122 views
6

我正在嘗試獲取給定月份和年份的第一個日期和最後一個日期。我使用以下代碼以yyyyMMdd格式獲取最後日期。但無法獲得這種格式。此外,我想以相同的格式開始日期。我仍在爲此工作。任何人都可以幫助我解決下面的代碼。java獲取給定月份和給定年份的第一個日期和最後一個日期

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

那麼什麼結果*的*你得到些什麼?你爲什麼要從'日期'(日曆的結果)轉換。getTime()'到'long',然後創建一個新的'Date')?你可以改用喬達時間,這將使這一切變得更加整潔嗎? –

+1

[如何獲取上個月的第一個日期和最後一個日期? (Java)](http://stackoverflow.com/questions/10828398/how-to-get-the-first-date-and-last-date-of-the-previous-month-java) –

回答

3

爲了得到開始日期

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

:在開始日期 = 1)

的格式化

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

它更改爲

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

更多細節

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

另一個方法

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

下面嘗試每月最後一天的代碼: -

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

你的回答應該包含對你的代碼的解釋以及它如何解決問題的描述。 – AbcAeffchen

3

只要您可以使用Calendar類。應先分配一個月的變量,你要

 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

雖然不完全的答案爲OP問題哪個月,下面的方法將給出當月第一&最後日期,如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); 
} 

邊注:使用的LocalDate.ofEpochDay(...)代替LocalDate.now()給人大大提高性能。此外,使用毫秒每日表達式而不是結束值(即86400000)表現更好。我最初以爲後者將執行比表達更好:P

爲什麼這個答案不過這不是OP問題的正確答案,但我還在原地回答這裏谷歌表明這個問題時,我搜索的Java 8月獲取的開始日期「:)

6

java.time.YearMonth

中的Java 8中的新java.time frameworkTutorial)已命令這一點。

恰如其命名YearMonth類代表一個月份的一年,沒有任何具體的日期或時間。從那裏我們可以詢問本月的第一天和第幾天。

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

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

2

第一天:

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

每月的最後一天:

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH); 
相關問題