如何在某一天添加​​一天?

时间:2009-06-17 07:11:35

标签: java datetime

我想在特定日期添加一天。我怎么能这样做?

Date dt = new Date();

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

17 个答案:

答案 0 :(得分:439)

鉴于Date dt你有几种可能性:

解决方案1:您可以使用Calendar类:

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

解决方案2 :由于Date类的各种缺点,您应该认真考虑使用 Joda-Time library 。使用Joda-Time,您可以执行以下操作:

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

解决方案3:使用 Java 8 ,您还可以使用新的 JSR 310 API(受Joda-Time启发):< / p>

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

答案 1 :(得分:62)

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

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

重要提示:在所有情况下都不正确。阅读下面的警告评论。

答案 2 :(得分:13)

正如Top回答中所提到的,从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);

答案 3 :(得分:12)

TL;博士

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

java.time

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

Instant

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

Instant instant = myUtilDate.toInstant() ;

您可以为此添加一天,但请记住这一点在UTC中。因此,您不会考虑夏令时等异常情况。使用ChronoUnit类指定时间单位。

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

ZonedDateTime

如果您想精通时区,请指定ZoneId以获得ZonedDateTime。以continent/region格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore


更新:Joda-Time库现在处于维护模式。该团队建议迁移到java.time类。我将完整地留下这部分历史。

约达时间

Joda-Time 2.3库使这种日期时间工作变得更加容易。与Java捆绑在一起的java.util.Date类非常麻烦,应该避免使用。

以下是一些示例代码。

您的java.util.Date将转换为Joda-Time DateTime对象。与j.u.Date不同,DateTime确实知道其指定的时区。时区是至关重要的,因为在明天增加一天以获得相同的wall-clock time可能意味着在美国Daylight Saving Time (DST)的情况下进行调整,例如23小时或25小时的日期。如果指定time zone,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

答案 4 :(得分:10)

我找到了一个向Date对象添加任意时间的简单方法

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

其中:

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

答案 5 :(得分:9)

这会使任何日期增加一个

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

答案 6 :(得分:9)

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

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

答案 7 :(得分:4)

使用DateTime对象obj.Add添加你想要的日期等等。 希望这有效:)

答案 8 :(得分:4)

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

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

或者

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

答案 9 :(得分:4)

Java 8 LocalDate API

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

答案 10 :(得分:3)

在非常特殊的情况下如果您要求自己开设日期课程,可能来自您的计算机编程教授;这种方法做得非常好。

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

答案 11 :(得分:3)

最好用的东西:

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

同样,您可以添加MONTHS,DAYS,MINUTES等

答案 12 :(得分:3)

为了减少特定于java的触摸,基本原则是转换为某种线性日期格式,朱利安天,修改后的朱利安天,自某个时代以来的秒数等,添加你的一天,并转换回来。

这样做的原因是你将“闰日,闰秒等权利问题”解决给那些运气不好的人。

我会提醒您,正确地进行这些转换程序可能很困难。有很多不同的方式让人们搞砸了时​​间,最近一个高调的例子是MS的Zune。不要在MS上玩太多的乐趣,但很容易搞砸。有多种不同的时间格式,例如TAI vs TT。

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

Java 8 Time API:

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

答案 15 :(得分:2)

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

<强> 输出:

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

有关更多信息,请参阅此类的Java文档:

答案 16 :(得分: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,因为您只想添加一天。

更多信息可以在this documentation找到。