Trong Java, làm cách nào để thêm một tháng vào ngày hiện tại?
Câu trả lời:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Java 8
LocalDate futureDate = LocalDate.now().plusMonths(1);
Bạn có thể sử dụng lớp tiện ích trợ giúp commons lang DateUtils của apache.
Date newDate = DateUtils.addMonths(new Date(), 1);
Bạn có thể tải xuống commons lang jar tại http://commons.apache.org/proper/commons-lang/
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 );
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 .
Nếu bạn muốn chỉ ngày, hãy sử dụng LocalDate
lớ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
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ó Instant
thà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.0
vậy, vì vậy hãy để java.time xác định thời gian trong ngày.
ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );
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 .
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();
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();
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ể sử dụng lớp DateUtils trong gói org.apache.commons.lang3.time
DateUtils.addMonths(new Date(),1);
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)
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);
Để 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);
}
java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
bâ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 .
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();
}`
Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
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