在Java中添加n个小时到一个日期?

时间:2010-08-27 04:07:42

标签: java date

如何在Date对象中添加n小时?我在StackOverflow上找到了另一个使用天数的例子,但仍然不明白如何用数小时来做。

15 个答案:

答案 0 :(得分:197)

检查日历类。它有add方法(和其他一些方法)来允许时间操作。这样的事情应该有效。

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

查看API了解更多信息。

答案 1 :(得分:70)

如果您使用Apache Commons / Lang,则可以使用DateUtils.addHours()一步完成:

Date newDate = DateUtils.addHours(oldDate, 3);

(原始对象不变)

答案 2 :(得分:28)

简化@ Christopher的例子。

假设你有一个常数

public static final long HOUR = 3600*1000; // in milli-seconds.

你可以写。

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

如果您使用 long 来存储日期/时间而不是Date对象,那么

long newDate = oldDate + 2 * HOUR;

答案 3 :(得分:23)

Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

答案 4 :(得分:23)

TL;博士

myJavaUtilDate.toInstant()
              .plusHours( 8 )

或者...

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

使用java.time

Java 8及更高版本中内置的java.time框架取代了旧的Java.util.Date/.Calendar类。那些古老的课程非常麻烦。避免它们。

使用新添加到java.util.Date的toInstant方法将旧类型转换为新的java.time类型。 InstantUTC中时间线上的一个时刻,分辨率为nanoseconds

Instant instant = myUtilDate.toInstant();

您可以通过TemporalAmount传递Duration来为Instant添加小时数。

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

要读取该日期时间,请通过调用toString生成标准ISO 8601格式的字符串。

String output = instantHourLater.toString();

您可能希望通过某个地区wall-clock time的镜头看到那一刻。通过创建ZonedDateTime

,将Instant调整为所需/预期的时区
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

或者,您可以致电plusHours添加您的小时数。划分区域意味着夏令时(DST),其他异常将代表您处理。

ZonedDateTime later = zdt.plusHours( 8 );

您应该避免使用旧的日期时间类,包括java.util.Date.Calendar。但是,如果您确实需要java.util.Date与尚未针对java.time类型更新的类的互操作性,请从ZonedDateTime转换为Instant。添加到旧类的新方法有助于转换为/从java.time类型转换。

java.util.Date date = java.util.Date.from( later.toInstant() );

有关转换的更多讨论,请参阅my Answer至问题Convert java.util.Date to what “java.time” type?

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& 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

答案 5 :(得分:21)

自Java 8以来:

LocalDateTime.now().minusHours(1);

请参阅LocalDateTime API

答案 6 :(得分:14)

类似的东西:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

答案 7 :(得分:11)

使用新的java.util.concurrent.TimeUnit课程,你可以这样做

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

答案 8 :(得分:6)

Date对象采用Datetime格式时,这是另一段代码。这段代码的优点是,如果您提供更多的小时数,日期也会相应更新。

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

这是输出:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014

答案 9 :(得分:4)

您可以使用Joda DateTime API

来完成
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

答案 10 :(得分:4)

如果您愿意使用java.time,可以使用以下方法添加ISO 8601格式的持续时间:

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  

答案 11 :(得分:3)

Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);

答案 12 :(得分:0)

使用Java 8类。我们可以很容易地操纵日期和时间,如下所示。

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

答案 13 :(得分:0)

您可以使用Java 8中的LocalDateTime类。例如:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

答案 14 :(得分:-1)

您可以使用此方法,易于理解和实施:

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}