Tôi đang làm việc với một ngày ở định dạng này : yyyy-mm-dd
.
Làm thế nào tôi có thể tăng ngày này thêm một ngày?
Tôi đang làm việc với một ngày ở định dạng này : yyyy-mm-dd
.
Làm thế nào tôi có thể tăng ngày này thêm một ngày?
Câu trả lời:
Một cái gì đó như thế này nên thực hiện các mẹo:
String dt = "2008-01-01"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1); // number of days to add
dt = sdf.format(c.getTime()); // dt is now the new date
add()
sẽ cuộn ngày. Xem trên ideone .
Java dường như đứng sau tám quả bóng so với C #. Phương thức tiện ích này chỉ ra cách thực hiện trong Java SE 6 bằng cách sử dụng phương thức Calendar.add (có lẽ là cách dễ dàng duy nhất).
public class DateUtil
{
public static Date addDays(Date date, int days)
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days); //minus number would decrement the days
return cal.getTime();
}
}
Để thêm một ngày, mỗi câu hỏi được hỏi, hãy gọi nó như sau:
String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);
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 .
Trên Java 8 trở lên, gói java.time làm cho điều này khá tự động. ( Hướng dẫn )
Giả sử String
đầu vào và đầu ra:
import java.time.LocalDate;
public class DateIncrementer {
static public String addOneDay(String date) {
return LocalDate.parse(date).plusDays(1).toString();
}
}
LocalDate
.
Tôi thích sử dụng DateUtils từ Apache. Kiểm tra http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . Nó rất hữu ích đặc biệt là khi bạn phải sử dụng nó nhiều nơi trong dự án của bạn và không muốn viết một phương thức lót cho việc này.
API nói:
addDays (Ngày ngày, số tiền int): Thêm một số ngày vào một ngày trả về một đối tượng mới.
Lưu ý rằng nó trả về một đối tượng Date mới và không thay đổi đối tượng trước đó.
Xây dựng một đối tượng Lịch và sử dụng phương thức add (Calendar.DATE, 1);
Hãy xem Joda-Time ( https://www.joda.org/joda-time/ ).
DateTimeFormatter parser = ISODateTimeFormat.date();
DateTime date = parser.parseDateTime(dateString);
String nextDay = parser.print(date.plusDays(1));
Xin lưu ý rằng dòng này thêm 24 giờ:
d1.getTime() + 1 * 24 * 60 * 60 * 1000
nhưng dòng này thêm một ngày
cal.add( Calendar.DATE, 1 );
Vào những ngày có sự thay đổi thời gian tiết kiệm ánh sáng ban ngày (25 hoặc 23 giờ), bạn sẽ nhận được kết quả khác nhau!
Java 8 đã thêm một API mới để làm việc với ngày và giờ.
Với Java 8, bạn có thể sử dụng các dòng mã sau:
// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");
// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);
januaryFirst.plusDays(1)
không date.plusDays(1)
.
bạn có thể sử dụng lib java.util đơn giản
Calendar cal = Calendar.getInstance();
cal.setTime(yourDate);
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
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 .
Date today = new Date();
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyyMMdd");
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 1); // number of days to add
String tomorrow = (String)(formattedDate.format(c.getTime()));
System.out.println("Tomorrows date is " + tomorrow);
Điều này sẽ cung cấp cho ngày mai. c.add(...)
các tham số có thể được thay đổi từ 1 sang số khác để tăng dần.
Date
hoặc Calendar
một lần nữa.
Nếu bạn đang sử dụng Java 8 , thì hãy làm như thế này.
LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27); // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format
String destDate = destDate.format(formatter)); // End date
Nếu bạn muốn sử dụng SimpleDateFormat , thì hãy làm như thế này.
String sourceDate = "2017-05-27"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate)); // parsed date and setting to calendar
calendar.add(Calendar.DATE, 1); // number of days to add
String destDate = sdf.format(calendar.getTime()); // End date
LocalDate
lớp không LocalDateTime
.
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);
Việc này lấy số mili giây kể từ epoch từ oldDate và thêm giá trị 1 mili giây sau đó sử dụng hàm tạo công khai Date () để tạo ngày bằng giá trị mới. Phương pháp này cho phép bạn thêm 1 ngày, hoặc bất kỳ số giờ / phút, không chỉ cả ngày.
Vì Java 1.5 TimeUnit.DAYS.toMillis (1) có vẻ sạch sẽ hơn đối với tôi.
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));
LocalDate
lớp trong các lớp java.time cho Java 8 trở lên và cổng sau cho Java 6 & Java 7 được tìm thấy trong dự án ThreeTen-Backport .
Trong Java 8 cách đơn giản để làm là:
Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))
Instant.now().plus( 1 , ChronoUnit.DAYS )
?
Trong java 8 bạn có thể sử dụng java.time.LocalDate
LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1); //Add one to the day field
Bạn có thể chuyển đổi thành java.util.Date
đối tượng như sau.
Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Bạn có thể LocalDate
tạo thành một Chuỗi như sau.
String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Nó rất đơn giản, cố gắng giải thích bằng một từ đơn giản. có được ngày hôm nay như dưới đây
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);
Bây giờ đặt trước một ngày với ngày này bằng phương thức calendar.add, phương thức này (không đổi, giá trị). Ở đây hằng số có thể là NGÀY, giờ, phút, giây, v.v. và giá trị là giá trị của hằng. Giống như trong một ngày, hằng số trước là Lịch.DATE và giá trị của nó là 1 vì chúng tôi muốn giá trị trước một ngày.
System.out.println(calendar.getTime());// print modified date which is
ngày mai
Cảm ơn
Apache Commons đã có DateUtils.addDays này (Ngày, số tiền) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java .util.Date,% 20int% 29 mà bạn sử dụng hoặc bạn có thể đi với JodaTime để làm cho nó sạch hơn.
Chỉ cần vượt qua ngày trong Chuỗi và số ngày tiếp theo
private String getNextDate(String givenDate,int noOfDays) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
String nextDaysDate = null;
try {
cal.setTime(dateFormat.parse(givenDate));
cal.add(Calendar.DATE, noOfDays);
nextDaysDate = dateFormat.format(cal.getTime());
} catch (ParseException ex) {
Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
}finally{
dateFormat = null;
cal = null;
}
return nextDaysDate;
}
Nếu bạn muốn thêm một đơn vị thời gian và bạn hy vọng rằng các trường khác cũng sẽ được tăng lên, bạn có thể sử dụng phương thức add một cách an toàn. Xem ví dụ dưới đây:
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
Sẽ in:
1970-12-31
1971-01-01
1970-12-31
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender
Calendar
lớp lỗi thời được thiết kế kém và dài vào năm 2019.
Nếu bạn sử dụng Java SE 8 trở lên, bạn nên sử dụng API Ngày / Giờ mới
int days = 7;
LocalDate dateRedeemed = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY");
String newDate = dateRedeemed.plusDays(days).format(formatter);
System.out.println(newDate);
Nếu bạn phải chuyển đổi từ java.util.Date
sang java.time.LocalDate
, bạn có thể sử dụng phương pháp này.
public LocalDate asLocalDate(Date date) {
Instant instant = date.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
return zdt.toLocalDate();
}
Nếu bạn đang sử dụng phiên bản trước Java SE 8, tôi khuyên bạn nên sử dụng Joda-Time
Joda-Time cung cấp một sự thay thế chất lượng cho các lớp ngày và giờ Java và là thư viện ngày và giờ tiêu chuẩn thực tế cho Java trước Java SE 8
int days = 7;
DateTime dateRedeemed = DateTime.now();
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/uuuu");
String newDate = dateRedeemed.plusDays(days).toString(formatter);
System.out.println(newDate);
java.time
một phần là không chính xác. Nó phải dd/MM/uuuu
tương đương với JodaTime.
Sử dụng DateFormat
API để chuyển đổi Chuỗi thành đối tượng Ngày, sau đó sử dụng Calendar
API để thêm một ngày. Hãy cho tôi biết nếu bạn muốn các ví dụ mã cụ thể và tôi có thể cập nhật câu trả lời của mình.
Nếu bạn đang sử dụng Java 8 java.time.LocalDate
và java.time.format.DateTimeFormatter
có thể làm cho công việc này khá đơn giản.
public String nextDate(String date){
LocalDate parsedDate = LocalDate.parse(date);
LocalDate addedDate = parsedDate.plusDays(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
return addedDate.format(formatter);
}
toString()
để tạo chuỗi định dạng i yyyy-MM-dd (và nếu bạn khăng khăng, hãy nhớ rằng đó mm
là phút trong khi MM
là tháng).
Bạn có thể sử dụng gói này từ "org.apache.commons.lang3.time":
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date myNewDate = DateUtils.addDays(myDate, 4);
Date yesterday = DateUtils.addDays(myDate, -1);
String formatedDate = sdf.format(myNewDate);
Date
lớp học năm 2018 là lời khuyên kém. Các lớp thời gian cũ rắc rối như java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
bây giờ là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle . Xem câu trả lời khác bằng cách sử dụng LocalDate
lớp.
SimpleDateFormat
lớp không may tiêm một múi giờ, ngầm áp dụng khu vực mặc định hiện hành của JVM. Vì vậy, kết quả của mã này sẽ thay đổi tùy theo mặc định hiện tại là gì - và mặc định đó có thể thay đổi bất cứ lúc nào trong thời gian chạy.
Thật ra nó đơn giản. Một ngày chứa 86400000 mili giây. Vì vậy, trước tiên bạn có được thời gian hiện tại tính bằng mili từ Hệ thống bằng cách sử dụng System.currentTimeMillis()
sau đó thêm 84000000 mili giây và sử dụng Date
Lớp để tạo định dạng ngày A cho mili giây.
Thí dụ
String Today = new Date(System.currentTimeMillis()).toString();
Chuỗi ngày hôm nay sẽ là 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
Chuỗi Tommorow sẽ là 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
Chuỗi ngàyAfterTommorow sẽ là 2019-05-11
Date
lớp khủng khiếp đã được thay thế từ nhiều năm trước bởi các lớp java.time hiện đại . Rất đơn giản để sử dụng đơn giản:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Hãy làm rõ trường hợp sử dụng: Bạn muốn thực hiện số học lịch và bắt đầu / kết thúc với java.util.Date .
Một số cách tiếp cận:
Cân nhắc sử dụng java.time.Instant :
Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);
Date
với các lớp java.time hiện đại như Instant
. Các lớp java.time thay thế hoàn toàn các lớp kế thừa. Cụ thể, Instant
thay thế java.util.Date
.
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);
Sun Apr 30 16:25:33 CEST 2017
đến Mon May 01 16:25:33 CEST 2017
. Đó vẫn là một giải pháp nản lòng. Không chỉ là phương pháp không dùng nữa vì một lý do chính đáng, trong năm 2017 chúng tôi cũng có những lựa chọn thay thế rất tốt cho Date
lớp học.