如何在Java中将日期增加一天?

use*_*094 537 java date

我正在使用这种格式的日期:yyyy-mm-dd.

如何将此日期增加一天?

小智 662

像这样的东西应该做的伎俩:

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
Run Code Online (Sandbox Code Playgroud)

  • @Esko,c.roll(Calendar.DATE,true)将不会在该月的最后一天滚动月份. (50认同)
  • @Ammar如果你不了解某件事,这是一个坏主意 (18认同)
  • 我将引用一些JavaDocs ... Calendar.DATE:"......这是DAY_OF_MONTH的同义词." 我希望JavaDocs能够澄清这会增加更大的字段(比如月份和年份).Calendar.roll"在给定的时间字段上添加或减去(上/下)单个时间单位而不更改更大的字段"..再次,"较大的字段"是模糊的,但这似乎与Sam的评论一致.我希望有一个StackOverflow来修复旧的JavaDocs. (13认同)
  • @Bagzerg:你错了**.`add()`将滚动日期.见[ideone](http://ideone.com/YQp7rp). (13认同)
  • 不幸的是,使用DATE,DAY_OF_MONTH甚至DAY_OF_YEAR添加天数是没用的 - 它们都是按模数递增的.所以考虑31-12-1970的日历,添加(DAY_OF_YEAR,1)或roll(),但roll()最后调用add(),将给01-01-1970.我想唯一正确的方法是用毫秒设置时间.至于我,我再也不会使用Calendar类了. (4认同)
  • 这就是为什么我想念c#.像获取UTC日期或将天数添加到今天的日期一样简单,需要这么多行代码.石器时代总库. (3认同)
  • 仅供参考,非常麻烦的旧日期时间类,如[`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html),[ `java.util.Calendar`](https://docs.oracle.com/javase/10/docs/api/java/util/Calendar.html)和`java.text.SimpleDateFormat`现在是[遗产]( https://en.wikipedia.org/wiki/Legacy_system),由[*java.time*]取代(https://docs.oracle.com/javase/10/docs/api/java/time/package- summary.html)Java 8及更高版本中内置的类.请参阅[*Tutorial*by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html). (3认同)
  • c.roll(Calendar.DATE,true); 为清晰起见会更好一些. (2认同)

Lis*_*isa 203

与C#相比,Java似乎远远落后于八球.此实用程序方法使用Calendar.add方法(可能是唯一简单的方法)显示Java SE 6中的方法.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

要根据提出的问题添加一天,请按以下方式调用:

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

  • 仅供参考,非常麻烦的旧日期时间类,如[`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html),[ `java.util.Calendar`](https://docs.oracle.com/javase/10/docs/api/java/util/Calendar.html)和`java.text.SimpleDateFormat`现在是[遗产]( https://en.wikipedia.org/wiki/Legacy_system),由[*java.time*]取代(https://docs.oracle.com/javase/10/docs/api/java/time/package- summary.html)Java 8及更高版本中内置的类.请参阅[*Tutorial*by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html). (4认同)

Dan*_*ral 73

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @DanielCSobral 是的。只需添加链接以供读者启发。不是批评。 (3认同)
  • 仅供参考,[ZonedDateDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html)和[`OffsetDateTime`](https://docs.oracle. com/javase/8/docs/api/java/time/OffsetDateTime.html)也有`plusDays`和`minusDays`方法以及`LocalDate` (2认同)

Ris*_*rna 64

我更喜欢使用Apache的DateUtils.请查看http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html.它非常方便,尤其是当您必须在项目中使用多个位置时,并且不希望为此编写单线方法.

API说:

addDays(Date date,int amount):在返回新对象的日期中添加若干天.

请注意,它返回一个新的Date对象,并且不会对前一个对象进行更改.


Ale*_*x B 57

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );
Run Code Online (Sandbox Code Playgroud)


kro*_*old 48

构造一个Calendar对象并使用方法add(Calendar.DATE,1);


小智 42

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

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除解析器调用以构造DateTime.使用DateTime date = new DateTime(dateString); 然后,nextDay是ISODateTimeFormat.date().print(date.plusDays(1)); 有关详细信息,请参阅http://joda-time.sourceforge.net/api-release/org/joda/time/DateTime.html#DateTime(java.lang.Object). (3认同)
  • 仅供参考……Joda-Time 项目现在处于维护模式,并建议迁移到 *java.time* 类。这两项工作均由同一个人斯蒂芬·科尔伯恩 (Stephen Colebourne) 领导。所以他们共享相似的概念,迁移并不困难。 (2认同)

mic*_*cha 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);
Run Code Online (Sandbox Code Playgroud)

  • 我猜你的意思是“januaryFirst.plusDays(1)”而不是“date.plusDays(1)”。 (2认同)
  • @Subho 对于 26 之前的 Android,请参阅 *ThreeTenABP* 项目,该项目改编了 *ThreeTen-Backport* 项目,如果大多数 *java-time* 功能向后移植到 Java 6 和 Java 7。 (2认同)

小智 39

请注意,这条线增加了24小时:

d1.getTime() + 1 * 24 * 60 * 60 * 1000
Run Code Online (Sandbox Code Playgroud)

但这条线增加了一天

cal.add( Calendar.DATE, 1 );
Run Code Online (Sandbox Code Playgroud)

在夏令时变化的日子(25或23小时),您将得到不同的结果!


小智 27

你可以使用Simple java.util lib

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
Run Code Online (Sandbox Code Playgroud)

  • 此答案复制了三年前的多个答案的内容,包括 [已接受的答案](http://stackoverflow.com/a/428966/642706)。请删除您的答案或编辑以增加价值。 (2认同)
  • 这个答案更清晰,并没有解析中间的日期."接受的答案"太复杂了.你添加了自己的优点,无视罗勒的自动评论 (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

这将给明天的日期.c.add(...)参数可以从1更改为另一个数字以获得适当的增量.

  • 您可以在添加之前执行 c.setTime(Date object) 之类的操作来设置特定的日期。 (2认同)
  • @Shn_Android_Dev Java 8 中内置的 *java.time* 类后来取代了可怕的旧日期时间类,并满足您的愿望。还在 *ThreeTen-Backport* 和 *ThreeTenABP* 项目中向后移植到 Java 6/7 和早期 Android。无需再次使用“日期”或“日历”。 (2认同)

Avi*_*kar 18

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

如果你想使用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
Run Code Online (Sandbox Code Playgroud)

  • 您的答案重复了至少四个其他答案的内容。请解释一下您的产品如何增加除这些之外的价值,或者在收集反对票之前删除。 (2认同)

dva*_*aey 15

long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);
Run Code Online (Sandbox Code Playgroud)

这将从oldDate开始占用epoch以来的毫秒数,并添加1天的毫秒数,然后使用Date()公共构造函数使用新值创建日期.此方法允许您添加1天或任意数量的小时/分钟,而不仅仅是整天.


Jen*_*ens 14

由于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));
Run Code Online (Sandbox Code Playgroud)


Ram*_*h-X 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
Run Code Online (Sandbox Code Playgroud)

您可以java.util.Date按如下方式转换为对象.

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Run Code Online (Sandbox Code Playgroud)

您可以LocalDate按如下方式合成String.

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Run Code Online (Sandbox Code Playgroud)


Kus*_*aha 10

这很简单,试着用一个简单的词来解释.得到今天的日期如下

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

现在通过calendar.add方法设置此日期的前一天,该方法采用(常量,值).这里的常数可以是DATE,hours,min,sec等,而value是常量的值.就像有一天一样,前面的常量是Calendar.DATE,它的值是1,因为我们想要提前一天的价值.

System.out.println(calendar.getTime());// print modified date which is 明天的约会

谢谢


dpk*_*dpk 10

在Java 8中,简单的方法是:

Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))
Run Code Online (Sandbox Code Playgroud)

  • 似乎有点拉伸.为什么不选择[`Instant.now().plus(1,ChronoUnit.DAYS)`](https://docs.oracle.com/javase/10/docs/api/java/time/Instant.html#加(long,java.time.temporal.TemporalUnit))? (9认同)

ROC*_*CKY 7

Apache Commons已经有了这个DateUtils.addDays(Date date,int amount) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java您使用的.util.Date,%20int%29,或者您可以使用JodaTime使其更清洁.


LMK*_*LMK 7

只需在String中传递日期和下一天的数量

 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;

}
Run Code Online (Sandbox Code Playgroud)


小智 7

如果要添加单个时间单位并且您希望其他字段也增加,则可以安全地使用add方法.见下面的例子:

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()));
Run Code Online (Sandbox Code Playgroud)

将打印:

1970-12-31
1971-01-01
1970-12-31
Run Code Online (Sandbox Code Playgroud)


小智 6

试试这个方法:

public static Date addDay(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, day);
        return calendar.getTime();
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*oss 5

使用DateFormatAPI将String转换为Date对象,然后使用CalendarAPI添加一天.如果您需要特定的代码示例,请告诉我,我可以更新我的答案.


Abd*_*pal 5

startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的贡献。但这已经在其他几个答案中了,所以我真的没有意义……除了恕我直言,没有人应该在2019年使用设计欠佳且过时的`Calendar`类。 (2认同)

Mik*_*e T 5

其实很简单。一天包含 86400000 毫秒。因此,首先您通过使用从系统获取当前时间(以毫秒为单位),System.currentTimeMillis()然后添加 84000000 毫秒并使用Date类生成毫秒的日期格式。

例子

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

字符串 今天将是 2019-05-9

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

弦乐明天将是 2019-05-10

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

字符串 DayAfterTommorow 将是 2019-05-11

  • 这段代码使用了多年前被现代 *java.time* 类取代的可怕的`Date` 类。简单地使用就简单多了:`LocalDate.parse("2019-01-23" ).plusDays(1)` (2认同)

Edu*_*iek 5

如果您使用Java SE 8或更高版本,则应使用新的日期/时间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);
Run Code Online (Sandbox Code Playgroud)

如果必须从转换java.util.Datejava.time.LocalDate,则可以使用此方法。

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

如果您使用的是Java SE 8之前的版本,建议您使用Joda-Time

Joda-Time提供了Java日期和时间类的质量替代,并且是Java SE 8之前的Java的事实上的标准日期和时间库。

   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);
Run Code Online (Sandbox Code Playgroud)