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

如何将n小时添加到Date对象? 我发现在StackOverflow上使用date的另一个例子,但仍然不明白如何使用几个小时。

检查日历类。 它有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了解更多。

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

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

(原始对象不变)

与乔达时间

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

简化@克里斯托弗的例子。

说你有一个常数

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

你可以写。

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

如果您使用long来存储date/时间而不是Date对象,则可以这样做

 long newDate = oldDate + 2 * HOUR; 

自从Java 8:

 LocalDateTime.now().minusHours(1); 

请参阅LocalDateTime API 。

就像是:

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

TL;博士

 myUtilDate.toInstant().plus( Duration.ofHours( 8 ) ) 

使用java.time

Java 8中内置的java.time框架取代旧的Java.util.Date/.Calendar类。 那些老class子是非常麻烦的。 避免他们。

使用新添加到java.util.Date的toInstant方法将旧types转换为新的java.timetypes。 Instant是UTC时间线上的一个时刻,分辨率为纳秒 。

 Instant instant = myUtilDate.toInstant(); 

您可以通过传递一个TemporalAmount例如Duration来为该Instant添加小时数。

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

要读取date时间,请通过调用toString生成标准ISO 8601格式的string。

 String output = instantHourLater.toString(); 

你可能想通过某个地区的挂钟时间的镜头看到这一刻。 通过创build一个ZonedDateTimeInstant调整到您想要的/预期的时区。

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

或者,您可以拨打plusHours来添加小时数。 被划分区域意味着夏令时(DST)和其他exception将以您的名义处理。

 ZonedDateTime later = zdt.plusHours( 8 ); 

您应该避免使用旧的date时间类,包括java.util.Date.Calendar 。 但是,如果您确实需要java.util.Date以便与尚未针对java.timetypes更新的类进行互操作,则需要通过InstantZonedDateTime进行转换。 添加到旧类的新方法有助于转换为java.timetypes。

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

有关转换的更多讨论,请参阅我的问题的答案 , 将java.util.Date转换为什么“java.time”types? 。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用…。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

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

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

Date对象处于Datetime格式时,这是另一段代码。 这个代码的优点是,如果你给更多的小时数date也会相应地更新。

  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 

你可以用Joda DateTime API来完成

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

如果你愿意使用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. 
 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); 

你可以使用这个方法,很容易理解和实现:

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