2013-01-23 90 views
6

Tôi đang cố gắng lấy ngày đầu tiên và ngày cuối cùng của tháng và năm đã cho. Tôi đã sử dụng đoạn mã sau để lấy ngày cuối cùng theo định dạng yyyyMMdd. Nhưng không thể có định dạng này. Ngoài ra sau đó tôi muốn ngày bắt đầu trong cùng một định dạng. Tôi vẫn đang làm việc này. Bất cứ ai có thể giúp tôi trong việc sửa mã dưới đây.java nhận ngày đầu tiên và ngày cuối cùng của tháng đã cho và năm nhất định

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

Vâng những gì kết quả * là * bạn nhận được? Và tại sao bạn chuyển đổi từ 'Ngày' (kết quả của' Lịch.getTime() 'thành một' long', và sau đó tạo một 'Date' mới? Và bạn có thể chuyển sang sử dụng Thời gian Joda, điều này sẽ làm cho tất cả những điều này trở nên dễ hiểu hơn không? –

+1

có thể trùng lặp của [Làm thế nào để có được ngày đầu tiên và ngày cuối cùng của tháng trước? (Java)] (http://stackoverflow.com/questions/10828398/how-to-get-the-first-date-and-last-date-of-the-previous-month-java) –

Trả lời

3

Để có được ngày Bắt đầu

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

(Note: trong Start hẹn hò với các ngày = 1)

cho định dạng

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

Thay đổi nó để

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

Để cụ thể hơn

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

Một cách tiếp cận

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

Hãy thử dưới đây mã cho ngày cuối cùng của tháng: -

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

Câu trả lời của bạn nên chứa giải thích về mã của bạn và mô tả cách giải quyết vấn đề. – AbcAeffchen

3

Đơn giản chỉ cần bạn có thể sử dụng Lịch lớp. bạn nên gán biến tháng mà tháng mà bạn muốn

 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

Mặc dù, không chính xác câu trả lời cho câu hỏi OP, dưới phương pháp này sẽ cho tháng hiện tại & ngày cuối cùng trước như trường hợp 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); 
} 

Side lưu ý: Sử dụng LocalDate.ofEpochDay(...) thay vì LocalDate.now() cho nhiều cải thiện hiệu suất. Ngoài ra, sử dụng biểu thức millis-in-a-day thay vì giá trị kết thúc, là 86400000 đang hoạt động tốt hơn. Ban đầu tôi nghĩ sau này sẽ hoạt động tốt hơn các biểu thức: P

Tại sao câu trả lời này: Tuy nhiên đây không phải là một câu trả lời chính xác cho câu hỏi OP, nhưng tôi vẫn đang trả lời ở đây là Google cho thấy câu hỏi này khi tôi tìm kiếm cho 'java 8 get ngày tháng bắt đầu' :)

6

java.time.YearMonth

mới java.time framework trong Java 8 (Tutorial) có lệnh cho việc này.

Lớp có tên là YearMonth có tên là tháng một năm, không có ngày hoặc giờ cụ thể. Từ đó chúng tôi có thể yêu cầu ngày đầu tiên và các ngày trong tháng.

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

Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

2

Ngày đầu tiên:

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

Ngày cuối cùng của tháng:

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH); 
Các vấn đề liên quan