ฉันจะเพิ่มวันที่แบบวันต่อวันใน Java ได้อย่างไร


561

yyyy-mm-ddฉันกำลังทำงานกับวันที่ในรูปแบบนี้:

ฉันจะเพิ่มวันที่นี้ภายในหนึ่งวันได้อย่างไร


10
หากคุณใช้ Java 8 หรือใหม่กว่าคุณสามารถใช้ API วันที่ / เวลาใหม่ได้ ดูคำตอบนี้: stackoverflow.com/a/23910924/1115554
micha

4
ใหม่ DateTime (). plusDays (1) .toDate () ???
เปียโตร

คำตอบ:


684

สิ่งนี้ควรทำเคล็ดลับ:

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

50
@Esko, c.roll (ปฏิทินวันที่จริง) จะไม่หมุนเดือนในวันสุดท้ายของเดือน
Sam Hasler

18
@ Amar เป็นความคิดที่ไม่ดีถ้าคุณไม่เข้าใจอะไรเลย
niccolo m

13
ฉันจะอ้างถึง JavaDocs ... ปฏิทินวันที่: "... นี่คือคำพ้องความหมายสำหรับ DAY_OF_MONTH" ฉันหวังว่า JavaDocs จะชี้แจงว่านี่จะเพิ่มฟิลด์ที่ใหญ่ขึ้น (เช่นเดือนและปี) Calendar.roll "เพิ่มหรือลบ (ขึ้น / ลง) เวลาหนึ่งหน่วยในเขตเวลาที่กำหนดโดยไม่ต้องเปลี่ยนฟิลด์ที่ใหญ่กว่า" .. อีกครั้ง "ฟิลด์ที่ใหญ่กว่า" นั้นคลุมเครือ แต่ดูเหมือนจะสอดคล้องกับความคิดเห็นของแซม ฉันหวังว่าจะมี StackOverflow สำหรับการแก้ไข JavaDocs แบบเก่า
jcalfee314

4
น่าเสียดายที่มันไม่มีประโยชน์อะไรที่จะเพิ่มวันโดยใช้ DATE, DAY_OF_MONTH หรือแม้กระทั่ง DAY_OF_YEAR - พวกเขาทั้งหมดเพิ่มขึ้นด้วยโมดูลัส ดังนั้นเมื่อพิจารณาปฏิทินที่ 31-12-1970 ให้เพิ่ม (DAY_OF_YEAR, 1) หรือ roll () แต่ roll () ในที่สุดก็เรียกเพิ่ม () ในที่สุดจะให้ 01-01-1970 ฉันเดาวิธีเดียวที่ถูกต้องคือการตั้งเวลาด้วยมิลลิวินาที สำหรับฉันฉันไม่เคยใช้คลาสปฏิทินอีกเลย
Dmitry Gryazin

14
@Bagzerg: คุณมีความผิด add()จะย้อนวันที่ เห็นในideone
Jean Hominal

211

Java ดูเหมือนจะดีหลังแปดลูกเมื่อเทียบกับ C # วิธีการยูทิลิตี้นี้แสดงวิธีการที่จะทำใน Java SE 6 โดยใช้วิธีการ Calendar.add (สันนิษฐานว่าเป็นวิธีที่ง่ายเท่านั้น)

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

หากต้องการเพิ่มหนึ่งวันตามคำถามที่ถามให้เรียกมันดังนี้:

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);

4
FYI, ลำบากชะมัดเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

79

java.time

บน Java 8 และใหม่กว่าแพ็คเกจ java.timeทำให้สิ่งนี้เป็นไปโดยอัตโนมัติ ( บทช่วยสอน )

สมมติว่าStringอินพุตและเอาต์พุต:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}

3
FYI ทั้งZonedDateDateTimeและOffsetDateTimeยังมีplusDaysและminusDaysวิธีการเช่นกันLocalDate
Basil Bourque

@BasilBourque แน่นอน LocalDateแต่ข้อมูลที่มีอยู่ในคำถามที่เป็นที่ของ
Daniel C. Sobral

2
@DanielCSobral Yep เพียงเพิ่มลิงก์สำหรับการแก้ไขของผู้อ่าน ไม่วิจารณ์
Basil Bourque

65

ฉันชอบที่จะใช้DateUtilsจาก Apache ตรวจสอบhttp://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.htmlมันมีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อคุณต้องใช้มันหลาย ๆ ที่ในโครงการของคุณและไม่ต้องการที่จะเขียนวิธีการซับเดียว

API กล่าวว่า:

addDays (วันที่วันที่, จำนวน int): เพิ่มจำนวนวันไปยังวันที่ส่งคืนวัตถุใหม่

โปรดทราบว่ามันจะส่งกลับวัตถุวันที่ใหม่และไม่ทำการเปลี่ยนแปลงไปก่อนหน้านี้เอง




43

ดู Joda-Time ( https://www.joda.org/joda-time/ )

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
คุณสามารถลบตัวแยกวิเคราะห์การโทรออกเพื่อสร้าง DateTime ใช้ DateTime date = ใหม่ DateTime (dateString) จากนั้น nextDay คือ ISODateTimeFormat.date () พิมพ์ (date.plusDays (1)); ดูjoda-time.sourceforge.net/api-release/org/joda/time/…สำหรับข้อมูลเพิ่มเติม
MetroidFan2002

สำหรับตัวอย่างโค้ดโดยละเอียดเพิ่มเติมโดยใช้ Joda-Time ดูคำตอบของคำถามที่คล้ายกันวิธีเพิ่มวันในหนึ่งวัน .
Basil Bourque

2
FYI …โครงการ Joda-Time อยู่ในโหมดบำรุงรักษาและให้คำแนะนำการโยกย้ายไปยังคลาสjava.time ความพยายามทั้งสองนำโดยชายคนเดียวกันสตีเฟ่นโคลบอร์น ดังนั้นพวกเขาจึงแบ่งปันแนวคิดที่คล้ายกันและการย้ายถิ่นไม่ใช่เรื่องยาก
Basil Bourque

40

โปรดทราบว่าบรรทัดนี้เพิ่ม 24 ชั่วโมง:

d1.getTime() + 1 * 24 * 60 * 60 * 1000

แต่บรรทัดนี้เพิ่มหนึ่งวัน

cal.add( Calendar.DATE, 1 );

ในวันที่มีการเปลี่ยนเวลาออมแสง (25 หรือ 23 ชั่วโมง) คุณจะได้รับผลลัพธ์ที่แตกต่างกัน!


40

Java 8 เพิ่ม API ใหม่สำหรับการทำงานกับวันที่และเวลา

ด้วย Java 8 คุณสามารถใช้โค้ดต่อไปนี้:

// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);

1
ผมคิดว่าคุณหมายถึงไม่ได้januaryFirst.plusDays(1) date.plusDays(1)
TeWu

สิ่งนี้ได้รับการสนับสนุนเฉพาะบน android O developer.android.com/reference/java/time/package-summary.html
Subho

1
@Subho สำหรับ Android ก่อน 26 ดูโครงการThreeTenABPที่ปรับโครงการThreeTen-Backportเป็นพอร์ตแบ็คถ้าฟังก์ชัน Java -timeส่วนใหญ่เป็นJava 6 และ Java 7
Basil Bourque

29

คุณสามารถใช้ Simple java.util lib

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();

1
คำตอบนี้ซ้ำเนื้อหาของหลายคำตอบรวมถึงคำตอบที่ยอมรับจากสามปีที่ผ่านมา โปรดลบคำตอบหรือแก้ไขเพื่อเพิ่มมูลค่า
Basil Bourque

3
คำตอบนี้สะอาดกว่าไม่แยกวันที่อยู่ตรงกลาง "คำตอบที่ยอมรับ" นั้นซับซ้อนเกินไป เป็นเรื่องที่ดีที่คุณเพิ่มของคุณโดยไม่สนใจคำพูดอัตโนมัติของโหระพา
มิกกี้ Perlstein

FYI, ลำบากชะมัดเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบที่ดีที่สุดตรงประเด็น ฉันเห็นด้วยกับมิคกี้เพียงไม่สนใจความคิดเห็นของโหระพา
eramirez75

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

สิ่งนี้จะให้วันพรุ่งนี้ c.add(...)พารามิเตอร์สามารถเปลี่ยนจาก 1 เป็นหมายเลขอื่นเพื่อการเพิ่มที่เหมาะสม


1
คุณสามารถทำบางอย่างเช่น c.setTime (วัตถุวันที่) เพื่อตั้งค่าวันที่ที่เฉพาะเจาะจงก่อนที่จะเพิ่ม
Linh Lino

ฉันหวังว่าแพคเกจจาวาเริ่มต้นจะทำให้การจัดการวันที่ซับซ้อนน้อยลง ... ฉันหมายถึงมันเป็นความเจ็บปวดทุกครั้งที่คุณต้องการจัดการกับวันที่ ... เพียงแค่โวยวาย ...
Shn_Android_Dev

1
@Shn_Android_Dev คลาสjava.time ที่สร้างขึ้นใน Java 8 และต่อมาแทนที่คลาสวันที่เก่าแก่ที่แย่มากและตอบสนองความต้องการของคุณ นอกจากนี้ยังกลับรังเพลิง Java 6/7 และก่อนหน้านี้ใน Android ThreeTen-ย้ายกลับและThreeTenABPโครงการ ไม่จำเป็นต้องเคยใช้DateหรือCalendarอีกครั้ง
Basil Bourque

19

หากคุณใช้Java 8ให้ทำเช่นนี้

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

หากคุณต้องการใช้SimpleDateFormatให้ทำเช่นนี้

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 LocalDateTime
Basil Bourque

1
คำตอบของคุณจะทำซ้ำเนื้อหาอย่างน้อยสี่คำตอบอื่น ๆ โปรดอธิบายวิธีเพิ่มมูลค่าของคุณนอกเหนือจากนั้นหรือลบทิ้งก่อนที่คุณจะรวบรวมคะแนนเสียง
Basil Bourque

16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

สิ่งนี้ใช้เวลาจำนวนมิลลิวินาทีนับตั้งแต่ยุคจาก oldDate และเพิ่มมูลค่า 1 วินาทีของมิลลิวินาทีจากนั้นใช้ตัวสร้างสาธารณะ Date () เพื่อสร้างวันที่โดยใช้ค่าใหม่ วิธีนี้ช่วยให้คุณเพิ่ม 1 วันหรือจำนวนชั่วโมง / นาทีใด ๆ ไม่เพียง แต่ทั้งวัน


นี่อาจไม่ใช่สิ่งที่ OP ต้องการ มันไม่ได้ตั้งค่าเผื่อไว้สำหรับการปรับประเภท Daylight Saving, leap วินาทีและอื่น ๆ
mrec

1
ควรจัดการการปรับเวลาตามฤดูกาลด้วยเขตเวลา / สถานที่ ตัวอย่างของฉันแสดงให้เห็นถึงวิธีการเพิ่มขึ้นในระยะเวลาสั้น ๆ เมื่อเพิ่มขึ้นทีละวัน, เผ่นวินาทีอาจเป็นปัญหา แต่เมื่อเพิ่มชั่วโมงมันมีโอกาสน้อยกว่าที่เป็นไปได้
dvaey

15

ตั้งแต่Java 1.5 TimeUnit.DAYS.toMillis (1)ดูสะอาดกว่าสำหรับฉัน

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การเรียนในชั้นเรียน java.time สำหรับ Java 8 และต่อมาและกลับพอร์ต Java 6 & Java 7 พบในThreeTen-ย้ายกลับโครงการ
Basil Bourque


11

ใน java 8 คุณสามารถใช้ 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

คุณสามารถแปลงเป็นjava.util.Dateวัตถุดังนี้

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

คุณสามารถจัดรูปLocalDateแบบเป็นสตริงได้ดังนี้

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

11

มันง่ายมากพยายามอธิบายด้วยคำง่ายๆ รับวันนี้วันที่ด้านล่าง

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);

ตอนนี้ตั้งหนึ่งวันล่วงหน้ากับวันที่นี้โดยวิธี calendar.add ซึ่งจะใช้เวลา (คงที่ค่า) ค่าคงที่นี้อาจเป็น DATE, ชั่วโมง, นาที, วินาทีเป็นต้นและค่าคือค่าคงที่ เช่นเดียวกับหนึ่งวันค่าคงที่ล่วงหน้าคือ Calendar วันที่และค่าเป็น 1 เพราะเราต้องการค่าล่วงหน้าหนึ่งวัน

System.out.println(calendar.getTime());// print modified date which is วันพรุ่งนี้

ขอบคุณ



7

เพียงแค่ผ่านวันที่ในสตริงและจำนวนวันถัดไป

 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;

}

7

หากคุณต้องการเพิ่มหน่วยเวลาเดียวและคุณคาดหวังว่าเขตข้อมูลอื่น ๆ จะเพิ่มขึ้นเช่นกันคุณสามารถใช้วิธีการเพิ่มได้อย่างปลอดภัย ดูตัวอย่างด้านล่าง:

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

จะพิมพ์:

1970-12-31
1971-01-01
1970-12-31

ไม่มีคำตอบที่ยอมรับได้และฉันรู้สึกว่ามีความสับสนโดยรวมถ้ามีการอัปเดตฟิลด์อื่นเช่นกัน
terrmith

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
ขอขอบคุณที่ต้องการมีส่วนร่วม อย่างไรก็ตามคำตอบนี้มีอยู่แล้วในหลาย ๆ คำตอบดังนั้นฉันจึงไม่เห็นประเด็น ... นอกจาก IMHO นั้นไม่มีใครควรใช้Calendarคลาสที่ออกแบบมาไม่ดีและล้าสมัยในปี 2019
Ole VV

6

หากคุณใช้ Java SE 8 หรือสูงกว่าคุณควรใช้Date / Time API ใหม่

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

หากคุณต้องแปลงจากjava.util.Dateเป็นjava.time.LocalDateคุณสามารถใช้วิธีนี้

  public LocalDate asLocalDate(Date date) {
      Instant instant = date.toInstant();
      ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
      return zdt.toLocalDate();
  }

หากคุณกำลังใช้เวอร์ชันก่อนหน้า Java SE 8 ฉันแนะนำให้คุณใช้Joda-Time

Joda-Time จัดเตรียมการแทนที่คุณภาพสำหรับคลาสวันที่และเวลาของ Java และเป็นไลบรารีวันที่และเวลามาตรฐานของพฤตินัยสำหรับ Java ก่อน 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);

1
รูปแบบของคุณสำหรับชิ้นjava.timeส่วนไม่ถูกต้อง มันควรจะdd/MM/uuuuเทียบเท่ากับ JodaTime อย่างใดอย่างหนึ่ง
TiiJ7

5

ใช้DateFormatAPI เพื่อแปลงสตริงเป็นวัตถุวันที่จากนั้นใช้CalendarAPI เพื่อเพิ่มหนึ่งวัน แจ้งให้เราทราบหากคุณต้องการตัวอย่างรหัสเฉพาะและฉันสามารถอัปเดตคำตอบของฉันได้


3

หากคุณใช้ Java 8 java.time.LocalDateและjava.time.format.DateTimeFormatterสามารถทำให้การทำงานนี้ค่อนข้างง่าย

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()เพื่อสร้างรูปแบบสตริง i yyyy-MM-dd (และหากคุณยืนยันโปรดจำไว้ว่าmmเป็นนาทีขณะที่MMเป็นเดือน)
Ole VV

3

คุณสามารถใช้แพ็คเกจนี้ได้จาก "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);  

5
Dateชั้นแนะนำในปี 2561 เป็นคำแนะนำที่ไม่ดี ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และ Java 9 โปรดดูที่การสอนโดยออราเคิล ดูคำตอบอื่น ๆ ที่ใช้LocalDateคลาส
Basil Bourque

ใช่ LocalDate IS เป็นวิธีที่ดีที่สุดในการทำเช่นนั้น
Shaheed

อย่างไรก็ตามเฟรมเวิร์กบางตัวเช่น jsf มีปัญหาการรวมเล็กน้อยกับ time API ดังนั้นบางครั้งคุณควรใช้ Date; plus environment java <8
Lucke

1
@Lucke ส่วนใหญ่ของjava.timeฟังก์ชันการทำงานที่ได้รับกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับโครงการ ปรับให้เข้ากับ Android รุ่นเก่าในโครงการThreeTenABP ดังนั้นไม่จำเป็นต้องแตะคลาสวันเวลาเก่า ๆ อันแสนสาหัสเลย เฟรมเวิร์กจำนวนมากได้รับการอัพเดต แต่ไม่ใช่ทั้งหมด ดังนั้นหากคุณต้องทำงานร่วมกับโค้ดเก่าที่ยังไม่ได้อัปเดตเป็นjava.timeให้เขียนโค้ดใหม่ของคุณในjava.timeและแปลงเป็น / จากประเภทเก่าโดยการเรียกวิธีการแปลงใหม่ที่เพิ่มในคลาสเก่า
Basil Bourque

1
รหัสนี้ไม่สนใจปัญหาที่สำคัญของโซนเวลา สำหรับช่วงเวลาใด ๆ วันที่จะแตกต่างกันไปตามแต่ละรอบ SimpleDateFormatระดับที่น่าเสียดายที่อัดฉีดโซนเวลาโดยปริยายใช้โซนเริ่มต้น JVM ปัจจุบัน ดังนั้นผลลัพธ์ของรหัสนี้จะแตกต่างกันไปตามค่าเริ่มต้นปัจจุบัน - และค่าเริ่มต้นนั้นสามารถเปลี่ยนแปลงได้ตลอดเวลาระหว่างรันไทม์
Basil Bourque

3

มันง่ายจริง ๆ หนึ่งวันมี 86400000 milliSeconds ดังนั้นก่อนอื่นคุณจะได้รับเวลาปัจจุบันเป็นมิลลิวินาทีจากระบบโดยใช้System.currentTimeMillis()แล้วเพิ่ม 84000000 มิลลิวินาทีและใช้Dateคลาสเพื่อสร้างรูปแบบวันที่สำหรับมิลลิวินาที

ตัวอย่าง

String Today = new Date(System.currentTimeMillis()).toString();

สตริงวันนี้จะเป็น 2019-05-9

String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();

String Tommorow จะเป็น 2019-05-10

String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();

String DayAfterTommorow จะเป็น 2019-05-11


รหัสนี้ใช้Dateคลาสที่แย่มากซึ่งถูกแทนที่เมื่อหลายปีก่อนโดยคลาสjava.time ที่ทันสมัย ง่ายกว่านี้มาก ๆ ที่จะใช้:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque

2

ขอชี้แจงกรณีการใช้งาน: คุณต้องการที่จะทำเลขคณิตปฏิทินและเริ่ม / จบลงด้วยการjava.util.Date

วิธีการบางอย่าง:

  1. แปลงเป็นสตริงและย้อนกลับด้วยSimpleDateFormat : นี่เป็นโซลูชันที่ไม่มีประสิทธิภาพ
  2. แปลงเป็นLocalDate : คุณจะสูญเสียข้อมูลเวลาใด ๆ
  3. แปลงเป็นLocalDateTime : ขั้นตอนนี้เกี่ยวข้องกับขั้นตอนเพิ่มเติมและคุณต้องกังวลเกี่ยวกับเขตเวลา
  4. แปลงเป็นยุคด้วยDate.getTime () : สิ่งนี้มีประสิทธิภาพ แต่คุณกำลังคำนวณด้วยมิลลิวินาที

พิจารณาใช้java.time.Instant :

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
ไม่เคยผสมเรียนมรดกที่น่ากลัวเช่นDateกับที่ทันสมัยjava.timeInstantเรียนเช่น java.timeเรียนทั้งหมดแย่งชั้นเรียนเดิม โดยเฉพาะแทนที่Instant java.util.Date
Basil Bourque

1
ไม่ตอบคำถาม คุณกำลังใช้คลาสที่แสดงช่วงเวลา (วันที่ที่มีช่วงเวลาของวันในบริบทของออฟเซ็ตหรือโซน) แต่คำถามถามเกี่ยวกับวันที่เท่านั้นโดยไม่มีเวลาของวันและไม่มีโซนเวลา ดูคำตอบที่ถูกต้องโดย Sobral และคำตอบที่ถูกต้องโดย micha
Basil Bourque

0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
fyi, Date.setDate () เลิกใช้แล้ว
Kelly S. French

บนคอมพิวเตอร์ของฉันดูเหมือนว่าจะทำงานข้ามเดือน หลังจากที่มาSun Apr 30 16:25:33 CEST 2017 Mon May 01 16:25:33 CEST 2017มันยังคงเป็นทางออกที่ท้อแท้ ไม่เพียง แต่เป็นวิธีการคัดค้านด้วยเหตุผลที่ดี แต่ในปี 2560 เรามีทางเลือกที่ดีมากในDateชั้นเรียน
Ole VV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.