如何在日期上加上一天?

我想在一个特定的日期上加上一天。我该怎么做呢?

Date dt = new Date();

现在我想在这个日期上加一天。

686094 次浏览

给定Date dt,你有几种可能性:

你可以使用Calendar类来实现:

Date dt = new Date();
Calendar c = Calendar.getInstance();
c.setTime(dt);
c.add(Calendar.DATE, 1);
dt = c.getTime();

你应该认真考虑使用Joda-Time library,因为Date类有各种缺点。使用Joda-Time你可以做以下事情:

Date dt = new Date();
DateTime dtOrg = new DateTime(dt);
DateTime dtPlusOne = dtOrg.plusDays(1);

解决方案3:使用Java 8,你也可以使用新的JSR 310 API(它的灵感来自Joda-Time):

Date dt = new Date();
LocalDateTime.from(dt.toInstant()).plusDays(1);

为了使它与java无关,基本原则是转换为某种线性日期格式,儒略日、修改的儒略日、从某个纪元开始的秒等,添加您的日期,然后转换回来。

这样做的原因是,您可以将“正确处理闰日、闰秒等”的问题外包给那些运气好的人,他们没有把这个问题搞砸。

我要提醒您,正确使用这些转换例程可能很困难。人们搞砸时间的方式多得惊人,最近一个高调的例子是微软的Zune。不要取笑MS,因为它很容易搞砸。即使有多种不同的时间格式,比如TAI和TT,也无济于事。

Date today = new Date();
Date tomorrow = new Date(today.getTime() + (1000 * 60 * 60 * 24));

Date有一个构造函数,使用自UNIX-epoch以来的毫秒数。getTime()-方法提供该值。所以把每一天的毫秒数加起来就可以了。如果你想定期做这样的操作,我建议为值定义常量。

重要提示:并非在所有情况下都是正确的。阅读下面的警告注释。

使用DateTime对象obj。加上任何你想要的时间等等。 希望这是有效的:)

这将使任何日期加1

String untildate="2011-10-08";//can take any date in current format
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse(untildate));
cal.add( Calendar.DATE, 1 );
String convertedDate=dateFormat.format(cal.getTime());
System.out.println("Date increase by one.."+convertedDate);

我更喜欢joda作为日期和时间算术,因为它可读性更好:

Date tomorrow = now().plusDays(1).toDate();

endOfDay(now().plus(days(1))).toDate()
startOfDay(now().plus(days(1))).toDate()

博士tl;

LocalDate.of( 2017 , Month.JANUARY , 23 )
.plusDays( 1 )

java.time

最好完全避免java.util.Date类。但是如果您必须这样做,您可以在麻烦的旧遗留日期时间类和现代java之间进行转换。时间类。查看添加到旧类中的新方法。

Instant

Instant类接近于Date,两者都是时间轴上的一个时刻。Instant解析为纳秒,而Date解析为毫秒。

Instant instant = myUtilDate.toInstant() ;

您可以在此基础上加上一天,但请记住这是UTC格式。因此,您不需要考虑日光节约时间等异常情况。使用ChronoUnit类指定时间单位。

Instant nextDay = instant.plus( 1 , ChronoUnit.DAYS ) ;

ZonedDateTime

如果你想精通时区,可以指定ZoneId来获得ZonedDateTime。指定格式为continent/region正确的时区名称,例如America/MontrealZonedDateTime0或Pacific/Auckland。永远不要使用3-4个字母的缩写,如ESTIST,因为它们是ZonedDateTime1真实时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
ZonedDateTime zdtNextDay = zdt.plusDays( 1 ) ;

你也可以用Period来表示你要添加的时间跨度,即一天。

Period p = Period.ofDays( 1 ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ).plus( p ) ;

你可能想要第二天的第一时刻。不要假设一天从00:00:00开始。异常情况,如日光节约时间(DST),意味着一天可能开始在另一个时间,如01:00:00。让java.time在那个区域确定那天的第一个时刻。

LocalDate today = LocalDate.now( z ) ;
LocalDate tomorrow = today.plus( p ) ;
ZonedDateTime zdt = tomorrow.atStartOfDay( z ) ;

关于java.time

< em > java.time < / em >框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗产日期-时间类,如java.util.DateCalendar, &SimpleDateFormat

现在在维护模式中的< em > Joda-Time < / em >项目建议迁移到java.time类。

要了解更多信息,请参见< < em >甲骨文教程/ em >。搜索Stack Overflow可以找到很多例子和解释。规格是JSR 310

你可以直接与你的数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java。时间类?

  • Java SE 8Java SE 9Java SE 10 . Java SE 10 . Java SE 10 . Java SE 10
    • 内置的。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小特性并进行了修复。
    • 李< / ul > < / >
    • Java SE 6Java SE 7
      • 大部分的java。时间功能向后移植到Java 6 &7在<强> < em > ThreeTen-Backport < / em > < / >强
      • 李< / ul > < / >
      • 安卓 .

        < >强ThreeTen-Extra < / >强项目扩展了java。额外的课程时间。这个项目是未来可能添加到java.time的一个试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多的


        Joda-Time库现在处于维护模式。团队建议迁移到java。时间类。我把这部分完整地保留下来作为历史。

        Joda-Time

        Joda-Time 2.3库使这种日期-时间工作更容易。与Java绑定的Java .util. date类是出了名的麻烦,应该避免。

        下面是一些示例代码。

        你的java.util.Date被转换为Joda-Time DateTime对象。与j.u.d date不同,DateTime真正知道它所分配的时区。时区是至关重要的,因为增加一天来获得明天相同的可能意味着做出调整,例如在美国的日光节约时间(DST)的情况下,一天23小时或25小时。如果指定时区, Joda-Time可以进行这种调整。在添加一天之后,我们将DateTime对象转换回java.util.Date对象。

        java.util.Date yourDate = new java.util.Date();
        
        
        // Generally better to specify your time zone rather than rely on default.
        org.joda.time.DateTimeZone timeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" );
        DateTime now = new DateTime( yourDate, timeZone );
        DateTime tomorrow = now.plusDays( 1 );
        java.util.Date tomorrowAsJUDate = tomorrow.toDate();
        

        转储到控制台…

        System.out.println( "yourDate: " + yourDate );
        System.out.println( "now: " + now );
        System.out.println( "tomorrow: " + tomorrow );
        System.out.println( "tomorrowAsJUDate: " + tomorrowAsJUDate );
        

        运行时……

        yourDate: Thu Apr 10 22:57:21 PDT 2014
        now: 2014-04-10T22:57:21.535-07:00
        tomorrow: 2014-04-11T22:57:21.535-07:00
        tomorrowAsJUDate: Fri Apr 11 22:57:21 PDT 2014
        

正如在顶部的回答中提到的,自从java 8以来,它可以做到:

Date dt = new Date();
LocalDateTime.from(dt.toInstant()).plusDays(1);

但这有时会导致像这样的DateTimeException:

java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-11-29T03:20:10.800Z of type java.time.Instant

可以通过简单地传递时区来避免此异常:

LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1);

在非常特殊的情况下,如果你要求做自己的约会课,可能是你的计算机编程教授;这个方法会做得很好。

public void addOneDay(){
int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
day++;
if (day> months[month-1]){
month++;
day = 1;
if (month > 12){
year++;
month = 1;
}
}
}

Java 1.8版本对数据时间API有很好的更新。

下面是一段代码:

    LocalDate lastAprilDay = LocalDate.of(2014, Month.APRIL, 30);
System.out.println("last april day: " + lastAprilDay);
LocalDate firstMay = lastAprilDay.plusDays(1);
System.out.println("should be first may day: " + firstMay);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd");
String formatDate = formatter.format(firstMay);
System.out.println("formatted date: " + formatDate);

输出:< em > < / em >

last april day: 2014-04-30
should be first may day: 2014-05-01
formatted date: 01

要了解更多信息,请参阅此类的Java文档:

最佳用法:

      long currenTime = System.currentTimeMillis();
long oneHourLater = currentTime + TimeUnit.HOURS.toMillis(1l);

类似地,你可以添加月、日、分钟等

你可以在进口org.apache.commons.lang.time.DateUtils之后使用这个方法:

DateUtils.addDays(new Date(), 1);

你可以像这样尝试java.util.Date库-

int no_of_day_to_add = 1;


Date today = new Date();
Date tomorrow = new Date( today.getYear(), today.getMonth(), today.getDate() + no_of_day_to_add );

根据需要更改no_of_day_to_add的值。

我已经将no_of_day_to_add的值设置为1,因为你只想添加一天。

更多可以在< >强这个文档< / >强中找到。

你想在几天后找到日期这个代码尝试..

public Date getToDateAfterDays(Integer day) {
Date nowdate = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(nowdate);
cal.add(Calendar.DATE, day);
return cal.getTime();
}

我将向你展示如何在Java 8中做到这一点。给你:

public class DemoDate {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("Current date: " + today);


//add 1 day to the current date
LocalDate date1Day = today.plus(1, ChronoUnit.DAYS);
System.out.println("Date After 1 day : " + date1Day);
}
}

输出:

Current date: 2016-08-15
Date After 1 day : 2016-08-16

java8时间API:

Instant now = Instant.now(); //current date
Instant after= now.plus(Duration.ofDays(300));
Date dateAfter = Date.from(after);

Java 8 LocalDate API

LocalDate.now().plusDays(1L);

我发现了一个简单的方法,可以向Date对象添加任意时间

Date d = new Date(new Date().getTime() + 86400000)

地点:

86 400 000 ms = 1 Day  : 24*60*60*1000
3 600 000 ms = 1 Hour :    60*60*1000