Làm cách nào để thêm một tháng vào ngày hiện tại trong Java?


Câu trả lời:


115
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);

thanx piyush và định dạng ngày cal này là gì, tôi cần lưu trữ cái này trong mysql
kiran

kiểu dữ liệu mysql cho ngày là DATETIME.
kiran

là định dạng này đúng ngày đó cal lại, mà tôi có thể sử dụng để lưu trữ trong mysql
Kiran

1
Mã Java để thêm một tháng vào ngày hiện tại ở định dạng mong muốn sẽ như hình dưới đây. Bây giờ, bạn có thể chuyển đổi Chuỗi này thành ngày tháng và chèn vào cơ sở dữ liệu MYSql. Lưu ý rằng bạn có thể thay đổi định dạng ngày trong hàm tạo DateFormat hoặc mới hơn trong truy vấn MYSQL bằng cách sử dụng hàm STR_TO_DATE (str, format). DateFormat định dạng = new SimpleDateFormat ("yyyy-MM-dd hh: mm: ss"); Lịch bây giờ = Calendar.getInstance (); now.add (Calendar.MONTH, 1); Chuỗi dateString = formatter.format (now.getTime ());
Piyush Mattoo

3
Tính năng này hiện đã lỗi thời: stackoverflow.com/questions/4905416/…
softarn

49

Java 8

LocalDate futureDate = LocalDate.now().plusMonths(1);

1
Để có java.util.Date: Date.from ((LocalDate.now () plusMonths (1)) atStartOfDay () atZone (ZoneId.systemDefault ()) toInstant ()....)
Ismail Yavuz


29

tl; dr

LocalDate::plusMonths

Thí dụ:

LocalDate.now( )
         .plusMonths( 1 );

Tốt hơn là chỉ định múi giờ.

LocalDate.now( ZoneId.of( "America/Montreal" )
         .plusMonths( 1 );

java.time

Khung java.time được tích hợp sẵn trong Java 8 trở lên. Những lớp học thay thế các lớp phiền ngày thời gian cũ như java.util.Date, .Calendar, & java.text.SimpleDateFormat. Nhóm Joda-Time cũng khuyên bạn nên di chuyển sang java.time.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích.

Phần lớn chức năng java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport và được điều chỉnh thêm cho Android trong ThreeTenABP .

Chỉ ngày

Nếu bạn muốn chỉ ngày, hãy sử dụng LocalDatelớp.

ZoneId z = ZoneId.of( "America/Montreal" );
 LocalDate today = LocalDate.now( z );

today.toString (): 2017-01-23

Thêm một tháng.

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString (): 2017-02-23

Ngày giờ

Có lẽ bạn muốn một thời gian trong ngày cùng với ngày tháng.

Trước tiên, hãy lấy thời điểm hiện tại theo giờ UTC với độ phân giải nano giây .

Instant instant = Instant.now();

Thêm một tháng có nghĩa là xác định ngày. Và xác định ngày có nghĩa là áp dụng múi giờ. Đối với bất kỳ thời điểm nào, ngày thay đổi trên khắp thế giới với một ngày mới ló dạng sớm hơn về phía đông. Vì vậy, hãy điều chỉnh nó Instantthành một múi giờ.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Bây giờ thêm tháng của bạn. Hãy để java.time xử lý Tháng nhuận và thực tế là các tháng có độ dài khác nhau.

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

Bạn có thể muốn điều chỉnh thời gian trong ngày thành thời điểm đầu tiên trong ngày khi thực hiện loại tính toán này. Thời điểm đầu tiên không phải lúc nào cũng 00:00:00.0vậy, vì vậy hãy để java.time xác định thời gian trong ngày.

ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );

Giới thiệu về java.time

Khung java.time được tích hợp sẵn trong Java 8 trở lên. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . 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 .

Lấy các lớp java.time ở đâu?

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


Joda-Time

Cập nhật: Dự án Joda-Time hiện đang ở chế độ bảo trì. Nhóm của nó khuyên bạn nên chuyển sang các lớp java.time. Tôi để nguyên phần này cho hậu thế.

Các Joda thời gian thư viện cung cấp một phương pháp để thêm tháng trong một cách thông minh.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = DateTime.now( timeZone );
DateTime nextMonth = now.plusMonths( 1 );

Bạn có thể muốn tập trung vào ngày bằng cách điều chỉnh thời gian trong ngày đến thời điểm đầu tiên trong ngày.

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();

12
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
java.util.Date dt = cal.getTime();

6

(phỏng theo Duggu)

public static Date addOneMonth(Date date)
{
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}

6

Sử dụng calander và thử mã này.

Calendar calendar = Calendar.getInstance();         
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
Date nextMonthFirstDay = calendar.getTime();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date nextMonthLastDay = calendar.getTime();

5
public Date  addMonths(String dateAsString, int nbMonths) throws ParseException {
        String format = "MM/dd/yyyy" ;
        SimpleDateFormat sdf = new SimpleDateFormat(format) ;
        Date dateAsObj = sdf.parse(dateAsString) ;
        Calendar cal = Calendar.getInstance();
        cal.setTime(dateAsObj);
        cal.add(Calendar.MONTH, nbMonths);
        Date dateAsObjAfterAMonth = cal.getTime() ;
    System.out.println(sdf.format(dateAsObjAfterAMonth));
    return dateAsObjAfterAMonth ;
}`

Bạn có thể cung cấp một số giải thích về những gì mã của bạn làm thay vì chỉ là một khối mã lớn?
Necoras

Mã của tôi hạn chế hơn và chung chung hơn. Tiết kiệm hơn vì nó chỉ xử lý ngày tháng (ở dạng chuỗi) với định dạng cố định "MM / dd / yyyy". Chung vì, nó cho phép bạn thêm bất kỳ tháng nào trong số các tháng dương vào ngày bạn đã chỉ định.
DJAM Silvère Gatien

Vì vậy, nếu bạn phải có mã ít hạn chế hơn lấy bất kỳ java.util.Date nào và hiển thị java.util.Date khác sau khi thêm một tháng, hãy xem bên dưới: Calendar cal = Calendar.getInstance (); cal.setTime (ngày tháng); cal.add (Calendar.MONTH, 1); cal.getTime ();
DJAM Silvère Gatien

3

bạn có thể sử dụng lớp DateUtils trong gói org.apache.commons.lang3.time

DateUtils.addMonths(new Date(),1);

Giải pháp đơn giản và dễ dàng.
Royal.O

2

Nếu bạn cần một lớp lót (tức là cho công thức Báo cáo Jasper) và đừng bận tâm nếu việc điều chỉnh không đúng một tháng (tức là "30 ngày" là đủ):

new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)


Đừng quên thêm hậu tố 'L' vào số khác nếu sẽ được coi là int đơn giản và sẽ tràn thành số âm!
Nicolas Buquet

1

Bạn có thể sử dụng như thế này;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = "2000-01-30";
Date date= new Date(sdf.parse(d).getTime());
date.setMonth(date.getMonth() + 1);

* @deprecated Kể từ phiên bản JDK 1.1, * được thay thế bằng <code> Calendar.set (Calendar.MONTH, int month) </code>. Như Date.java nói.
Jasper Lankhorst

1

Để tìm được ngày sau một tháng thì cần phải xem hôm nay là ngày gì trong tháng.

Vì vậy, nếu ngày là ngày đầu tiên của tháng, hãy chạy mã sau

Calendar calendar = Calendar.getInstance();

    Calendar calFebruary = Calendar.getInstance();
    calFebruary.set(Calendar.MONTH, Calendar.FEBRUARY);

    if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {// if first day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
    Date nextMonthFirstDay = calendar.getTime();
    System.out.println(nextMonthFirstDay);

    }

nếu ngày là ngày cuối cùng của tháng, hãy chạy các mã sau.

    else if ((calendar.getActualMaximum(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH))) {// if last day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);
    }

nếu ngày là trong tháng hai, hãy chạy mã sau

    else if (calendar.get(Calendar.MONTH) == Calendar.JANUARY
            && calendar.get(Calendar.DAY_OF_MONTH) > calFebruary.getActualMaximum(Calendar.DAY_OF_MONTH)) {// control of february

    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);

    }

các mã sau được sử dụng cho các trường hợp khác.

    else { // any day
    calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date theNextDate = calendar.getTime();
    System.out.println(theNextDate);
    }

FYI, các lớp học ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

0

Phương thức này trả về ngày hiện tại cộng với 1 tháng.

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`

0
    Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();

-3
public class StringSplit {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        date(5, 3);
        date(5, 4);
    }

    public static String date(int month, int week) {
        LocalDate futureDate = LocalDate.now().plusMonths(month).plusWeeks(week);
        String Fudate = futureDate.toString();
        String[] arr = Fudate.split("-", 3);
        String a1 = arr[0];
        String a2 = arr[1];
        String a3 = arr[2];
        String date = a3 + "/" + a2 + "/" + a1;
        System.out.println(date);
        return date;
    }
}

Đầu ra:

10/03/2020
17/03/2020

1
Trước hết, câu trả lời là sai dựa trên OP. Thứ hai OP đã được trả lời cách đây 8 (!) Năm và thứ ba có nhiều cách tốt hơn để định dạng đầu ra ngày tháng hơn là sử dụng vô số chuỗi.
Markus Deibel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.