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


560

我在此格式的日期的工作:yyyy-mm-dd

如何将这一日期增加一天?


10
如果您使用的是Java 8或更高版本,则可以使用新的日期/时间api。看到这个答案:stackoverflow.com/a/23910924/1115554
micha

4
新的DateTime()。plusDays(1).toDate()???
Pietro

Answers:


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(Calendar.DATE,true)不会在月份的最后一天滚动月份。
山姆·哈斯勒

18
@Ammar,如果您不了解某事,这是个坏主意
niccolo m。

13
我将引用一些JavaDocs ... Calendar.DATE:“ ...这是DAY_OF_MONTH的同义词。” 我希望JavaDocs能够阐明这会增加较大的字段(例如月份和年份)。Calendar.roll“在给定的时间字段上增加或减少(向上/向下)单个时间单位,而不更改较大的字段”。.同样,“较大的字段”含糊不清,但这似乎与Sam的评论一致。我希望有一个StackOverflow来修复旧的JavaDocs。
jcalfee314

4
伙计们,不幸的是,使用DATE,DAY_OF_MONTH甚至DAY_OF_YEAR来添加天数是没有用的-它们都按模数递增。因此,考虑到1970年12月31日的Calendar,则add(DAY_OF_YEAR,1)或roll(),但是roll()最后调用add()的结果为01-01-1970。我猜唯一正确的方法是将时间设置为毫秒。对于我来说,我再也不会使用Calendar类。
德米特里·格里亚津

14
@Bagzerg:你错了add()将滚动日期。见ideone
让·霍米纳尔

211

与C#相比,Java确实确实落后于8球。该实用程序方法显示了使用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();
    }
}

要增加一天的时间,请根据提出的问题进行如下称呼:

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

4
仅供参考,非常麻烦旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle 教程
罗勒·布尔克

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
仅供参考,ZonedDateDateTime并且OffsetDateTime也具有plusDaysminusDays方法以及LocalDate
Basil Bourque

@BasilBourque可以,但是问题中可用的信息是LocalDate
Daniel C. Sobral

2
@DanielCSobral是的。只需添加链接以供读者阅读。不批评。
罗勒·布尔克

65

我更喜欢使用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对象,并且不会更改前一个对象本身。


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );


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 = new DateTime(dateString); 然后,nextDay是ISODateTimeFormat.date()。print(date.plusDays(1)); 有关更多信息,请参见joda-time.sourceforge.net/api-release/org/joda/time/…
MetroidFan2002

有关使用Joda-Time的更详细的示例代码,请参见对类似问题“ 如何在日期中添加一天?”的回答
罗勒·布尔克

2
仅供参考... Joda-Time项目现在处于维护模式,建议迁移到java.time类。两项工作均由同一个人Stephen Colebourne领导。因此,它们具有相似的概念,迁移并不困难。
罗勒·布尔克

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


1
@Subho对于Android的26之前,请参阅ThreeTenABP项目适应ThreeTen-反向移植项目,后端口,如果大部分的Java的时间功能的Java 6和Java 7
罗勒布尔克

29

您可以使用Simple java.util lib

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

1
该答案重复了多个答案的内容,包括三年前接受的答案。请删除您的答案或编辑以增加价值。
罗勒·布尔克

3
这个答案更干净,不解析中间的日期。“可接受的答案”太复杂了。很好,您添加了自己的内容,无视罗勒的自动讲话
Mickey Perlstein

仅供参考,非常麻烦旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle 教程
罗勒·布尔克

最佳答案,直截了当。我同意米奇的看法,只是不理会罗勒的评论
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(Date object)的操作来设置添加之前的特定日期。
Linh Lino 2014年

我希望默认的Java程序包能使处理日期的过程减少复杂性……我的意思是每次您要处理日期时都感到非常痛苦……简直就是rant头……
Shn_Android_Dev

1
@Shn_Android_Dev Java 8和更高版本中内置的java.time类取代了可怕的旧日期时间类,并满足了您的愿望。还已在ThreeTen- BackportThreeTenABP项目中反向移植到Java 6/7和更早的Android 。无需曾经使用DateCalendar试。
罗勒·布尔克

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
罗勒·布尔克

1
您的答案会重复至少其他四个答案的内容。请说明您的产品如何增加价值,或者在您收集不赞成票之前删除它们。
罗勒·布尔克

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

这花费了从oldDate到新纪元以来的毫秒数,并增加了1天的毫秒数,然后使用Date()公共构造函数使用新值创建日期。此方法使您可以添加1天或任意数量的小时/分钟,而不仅仅是整天。


这可能不是OP想要的。它不会为夏令时类型的调整,seconds秒等提供任何余地。
mrec

1
夏令时应按时区/地区进行处理。我的示例显示了如何以较小的持续时间递增。当以天为单位递增时,leap秒可能是个问题,但增加小时数则不太可能,尽管仍然可行。
dvaey 2014年

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

这将创建一个日期时间值,其中“问题”仅要求提供日期。我建议一种更明智的方法是LocalDateJava 8及更高版本的java.time类中的类,以及在ThreeTen-Backport项目中找到的Java 6和Java 7的反向移植
罗勒·布尔克


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.DATE,其值为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

如果要添加单个时间单位,并且希望其他字段也要增加,则可以安全地使用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()));

将打印:

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

没有可接受的答案,我觉得如果同时更新其他领域,也会引起整体混乱。
特尔米斯,2015年


6

如果您使用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);

如果必须从转换java.util.Datejava.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 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);

1
您的java.time零件图案不正确。它应该dd/MM/uuuu等效于JodaTime。
TiiJ7,19年

5

使用DateFormatAPI将String转换为Date对象,然后使用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在2018年上课不是很好的建议。麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8的Java 9.请参见类教程由Oracle。参见使用LocalDate类的其他答案。
罗勒·布尔克

是的,LocalDate是执行此操作的最佳方法,
Shaheed

但是,诸如jsf之类的某些框架在与时间API集成方面存在一些问题,因此有时您应该使用Date;加上环境Java <8
幸运地

1
的@Lucke大多数java.time功能是后移植到Java 6和7的ThreeTen-反向移植项目。在ThreeTenABP项目中进一步适应了较旧的Android 。因此,真的不需要接触那些血腥的糟糕的旧日期时间类。许多框架已更新。但不是所有的。因此,如果您必须与尚未更新为java.time的旧代码进行互操作,请在java.time中编写新代码,并通过调用添加到旧类中的新转换方法来与旧类型进行转换。
罗勒·布尔克

1
该代码忽略了时区关键问题。对于任何给定时刻,日期在全球范围内都按区域变化。SimpleDateFormat不幸的是,该类注入了一个时区,隐式地应用了JVM的当前默认时区。因此,此代码的结果将随当前默认值的不同而有所不同-并且该默认值可以运行时随时更改。
罗勒·布尔克

3

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

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 )
罗勒·布尔克

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.time类(例如)混合使用Instant。该java.time类完全取代传统的类。具体来说,Instant替换java.util.Date
罗勒·布尔克

1
不解决问题。您正在使用代表时刻的类(在偏移量或区域的上下文中带有日期的日期的类)。但是问题问的是仅日期而不是日期和时区。见正确答案由索布拉尔和正确答案的米莎。
罗勒·布尔克

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。但是,这仍然是不鼓励的解决方案。不仅有理由不推荐使用该方法,而且在2017年,我们还提供了Date该类的很好的替代方法。
Ole VV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.