ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如何将此日期增加一天?

如果您使用的是 Java 8 或更新版本,您可以使用新的日期/时间 API。看到这个答案:stackoverflow.com/a/23910924/1115554
新的 DateTime().plusDays(1).toDate() ???

S
Sam Hasler

这样的事情应该可以解决问题:

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

@Esko,c.roll(Calendar.DATE, true) 不会在该月的最后一天滚动该月。
我将引用一些 JavaDocs... Calendar.DATE:“...这是 DAY_OF_MONTH 的同义词。”我希望 JavaDocs 能澄清这会增加更大的字段(如月份和年份)。 Calendar.roll “在给定时间字段上添加或减去(上/下)单个时间单位而不更改更大的字段” .. 同样,“更大的字段”含糊不清,但这似乎与 Sam 的评论一致。我希望有一个 StackOverflow 来修复旧的 JavaDocs。
伙计们,不幸的是,使用 DATE、DAY_OF_MONTH 甚至 DAY_OF_YEAR 添加天数是毫无用处的——它们都是按模数递增的。因此考虑到 1970 年 12 月 31 日的日历,add(DAY_OF_YEAR, 1) 或 roll(),但是 roll() 最终调用 add(),将给出 01-01-1970。我想唯一正确的方法是以毫秒为单位设置时间。至于我,我再也不会使用 Calendar 类了。
@Bagzerg:你错了add() 将滚动日期。请参阅 ideone
仅供参考,非常麻烦的旧日期时间类(例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat)现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle
L
Lisa

更新(2021 年 5 月):对于旧的、旧的 Java,这是一个非常过时的答案。对于 Java 8 及更高版本,请参阅 https://stackoverflow.com/a/20906602/314283

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

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

仅供参考,非常麻烦的旧日期时间类(例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat)现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle
B
Basil Bourque

java.time

在 Java 8 及更高版本上,java.time package 使这非常自动化。 (Tutorial)

假设 String 输入和输出:

import java.time.LocalDate;

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

仅供参考,ZonedDateDateTimeOffsetDateTime 也有 plusDaysminusDays 方法以及 LocalDate
@BasilBourque 当然,但问题中可用的信息是LocalDate
@DanielCSobral 是的。只需添加链接以供读者启迪。不是批评。
E
Edward Anderson

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


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

N
Neuron

构造一个日历对象并调用 add(Calendar.DATE, 1);


m
micha

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

我猜你的意思是 januaryFirst.plusDays(1) 而不是 date.plusDays(1)
@Subho 对于 26 岁之前的 Android,请参阅 ThreeTenABP 项目,该项目改编了 ThreeTen-Backport 项目,如果大多数 java-time 功能适用于 Java 6 和 Java 7,则为后向端口。
J
JodaStephen

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

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

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

您可以删除用于构造 DateTime 的解析器调用。使用 DateTime date = new DateTime(dateString);那么,nextDay 就是 ISODateTimeFormat.date().print(date.plusDays(1));有关详细信息,请参阅 joda-time.sourceforge.net/api-release/org/joda/time/…
有关使用 Joda-Time 的更详细示例代码,请参阅类似问题 How to add one day to a date?my answer
仅供参考……Joda-Time 项目现在处于维护模式,并建议迁移到 java.time 类。这两项努力都是由同一个人斯蒂芬科尔伯恩领导的。所以他们有相似的概念,迁移并不难。
F
Florian R.

请注意,此行增加了 24 小时:

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

但是这条线增加了一天

cal.add( Calendar.DATE, 1 );

在夏令时更改(25 或 23 小时)的日子里,您会得到不同的结果!


P
Pawan Pareek

你可以使用简单的 java.util 库

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

此答案复制了三年前的多个答案的内容,包括 the accepted Answer。请删除您的答案或编辑以增加价值。
这个答案更干净,不解析中间的日期。 “接受的答案”太复杂了。很好,你添加了你的,忽略罗勒的自动评论
仅供参考,非常麻烦的旧日期时间类(例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat)现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle
最佳答案,直截了当。我同意米奇,只是无视罗勒的评论
R
Rey
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 更改为另一个数字以获得适当的增量。


您可以在添加之前执行类似 c.setTime(Date object) 的操作来设置特定的日期。
我希望默认的 java 包可以减少处理日期的复杂性......我的意思是每次你想处理日期时都会很痛苦......只是咆哮......
@Shn_Android_Dev Java 8 内置的 java.time 类,后来取代了可怕的旧日期时间类,并满足您的愿望。也向后移植到 Java 6/7 & ThreeTen-BackportThreeTenABP 项目中的早期 Android。无需再次使用 DateCalendar
A
Avijit Karmakar

如果您使用的是 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
您的答案重复了至少四个其他答案的内容。请解释您的产品如何增加价值,或者在您收集反对票之前删除。
J
Jens

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

这将创建一个日期时间值,其中问题要求仅提供日期。我建议更明智的方法是 Java 8 及更高版本的 java.time 类中的 LocalDate 类,以及 Java 6 和更高版本的反向移植。在 ThreeTen-Backport 项目中找到 Java 7。
d
dvaey
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

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


这可能不是 OP 想要的;它没有考虑夏令时类型的调整、闰秒等。
夏令时应按时区/语言环境处理。我的例子是展示如何增加小持续时间。当按天递增时,闰秒可能是一个问题,但当增加小时时,虽然仍有可能,但不太可能。
d
dpk

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

Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))

似乎有点牵强。为什么不直接使用 Instant.now().plus( 1 , ChronoUnit.DAYS )
Y
Yoon5oo

很简单,试着用一个简单的词来解释。获取今天的日期如下

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

现在通过使用(常量,值)的 calendar.add 方法将此日期提前一天。这里的常量可以是 DATE、小时、分钟、秒等,而 value 是常量的值。就像一天一样,提前常量是 Calendar.DATE,它的值为 1,因为我们想要提前一天的值。

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

谢谢


为了代码的可读性,最好使用同义词常量 Calendar.DAY_OF_MONTH
A
Abdurahman Popal
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

感谢您愿意做出贡献。然而,这已经在其他几个答案中了,所以我真的认为没有意义......除此之外,恕我直言,没有人应该在 2019 年使用设计不佳且早已过时的 Calendar 类。
为了代码的可读性,最好使用同义词常量 Calendar.DAY_OF_MONTH
R
Ramesh-X

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

e
eHayik

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

R
ROCKY

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 以使其更清洁。


L
LMK

只需在字符串中传递日期和接下来的天数

 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;

}

t
terrmith

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

没有公认的答案,如果其他字段也更新,我觉得整体混乱。
R
Ross

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


R
Rachid Azzanati

试试这个方法:

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

看起来是正确的,但 CalendarDate 类设计不佳且过时已久,因此不建议采用这种方式。首选LocalDate.now(ZoneId.systemDefault()).plusDays(day)。此外,我看不出你贡献了 Lisa 投票第二高的答案中没有的任何重要内容。
你好,我完全同意你的看法,但在发表我的之前,我还没有看到第二高的投票答案。
为了代码的可读性,最好使用同义词常量 Calendar.DAY_OF_MONTH
M
Mike T

其实很简单。一天包含 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 )
J
JonathanDavidArndt

您可以使用“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);  

在 2018 年推荐 Date 课是很糟糕的建议。麻烦的旧日期时间类(例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat)现在是 legacy,被 Java 8 & 中内置的 java.time 类所取代。 Java 9。见 Tutorial by Oracle。使用 LocalDate 类查看其他答案。
是的,LocalDate 是最好的方法,
然而,像 jsf 这样的框架在时间 API 方面存在一些集成问题,所以有时你应该使用 Date;加环境 java < 8
@Lucke 大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 7。在 ThreeTenABP 项目中进一步适应了旧的 Android。所以,真的没有必要碰那些该死的、可怕的旧约会时间课程。许多框架已更新。但不是所有的。因此,如果您必须与尚未更新到 java.time 的旧代码进行互操作,请在 java.time 中编写新代码,并通过调用添加到旧类的新转换方法与旧类型进行转换。
此代码忽略了时区的关键问题。对于任何给定的时刻,日期在全球各地按区域变化。 SimpleDateFormat 类不幸地注入了一个时区,隐式地应用了 JVM 的当前默认时区。因此,无论当前默认值是什么,此代码的结果都会有所不同——并且该默认值可以在运行时期间随时更改。
E
Evan

如果您使用的是 Java 8,java.time.LocalDatejava.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 是月份)。
C
Chad Juliano

让我们澄清一下用例:您想要进行日历算术并以 java.util.Date 开始/结束。

一些方法:

使用 SimpleDateFormat 转换为字符串并返回:这是一种低效的解决方案。转换为 LocalDate:您将丢失任何时间信息。转换为 LocalDateTime:这涉及更多步骤,您需要担心时区。使用 Date.getTime() 转换为纪元:这很有效,但您是用毫秒计算的。

考虑使用 java.time.Instant

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

切勿将糟糕的遗留类(例如 Date)与现代的 java.time 类(例如 Instant)混用。 java.time 类完全取代了遗留类。具体来说,Instant 替换了 java.util.Date
没有解决问题。您正在使用代表时刻的类(在偏移量或区域的上下文中具有时间的日期)。但是问题只询问没有时间和时区的日期。参见 Sobral 的 correct Answer 和 micha 的 correct Answer
s
samtax01

你可以在一行中做到这一点。

例如增加 5 天

Date newDate = Date.from(Date().toInstant().plus(5, ChronoUnit.DAYS));

减去 5 天

Date newDate = Date.from(Date().toInstant().minus(5, ChronoUnit.DAYS));

F
Filip Trajcevski
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

仅供参考,不推荐使用 Date.setDate()
在我的电脑上,它似乎可以跨越一个月的边界。 Sun Apr 30 16:25:33 CEST 2017 之后是 Mon May 01 16:25:33 CEST 2017。尽管如此,这仍然是一个不鼓励的解决方案。不仅该方法被弃用是有充分理由的,而且在 2017 年,我们还有 Date 类的非常好的替代品。