在Java中向日期对象添加时间(以小时为单位)?

时间:2018-04-01 14:05:49

标签: java date time

如何为日期对象添加小时数。以下是我的代码:

String dateStart = timeStamp;
String dateStop = valueCon;

SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");

Date d1 = null;
Date d2 = null;

d1 = format.parse(dateStart);
d2 = format.parse(datestop);

我想为d2日期对象添加4个小时。我如何实现它?

我试图使用:

Date modd1= new Date(d2+TimeUnit.MINUTES.toHours(240));

但它只接受添加的长对象。因此失败了。

请支持解决这个问题。谢谢。

6 个答案:

答案 0 :(得分:1)

如果您使用java.time,则可能会更有帮助:

LocalDateTime dateStart = LocalDateTime.now();
LocalDateTime dateStop = dateStart.plusHours(4);

格式化您可以使用的日期:

String d1 = dateStart.format(DateTimeFormatter.ofPattern("yy/MM/dd HH:mm:ss"));
String d2 = dateStop.format(DateTimeFormatter.ofPattern("yy/MM/dd HH:mm:ss"));

答案 1 :(得分:1)

有几种方法可以做到

使用日历类

Calendar cal = Calendar.getInstance(); // creates calendar
cal.setTime(anyDateObject); // sets calendar time/date
cal.add(Calendar.HOUR_OF_DAY, 4); // adds four hour
Date date = cal.getTime(); // returns new date object 

如果您使用的是ApacheCOmmon Lang

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

如果您使用的是Joda-time

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

如果你最好使用Java 8,那么LocalDateTime

LocalDateTime startDate = LocalDateTime.now();
LocalDateTime stopdate = startDate.plusHours(4);

答案 2 :(得分:0)

你可以做点什么

Calendar c = Calendar.getInstance();
c.setTimeInMillis(d2.getTime());
c.add(Calendar.HOUR_OF_DAY, 4);
d2 = c.getTime();

答案 3 :(得分:0)

和其他人一样,如果这是一个选项,我建议使用java.time。 API更加一致,并且可以更好地满足这些类型的操作。

但是,按原样回答您的问题...一个选项是使用Date调整get/setTime()实例的毫秒形式,如下所示:

@Test
public void adjustTime() {
    final Date date = new Date();

    System.out.println("## Before adding four hours: " + date);

    date.setTime(date.getTime() + TimeUnit.HOURS.toMillis(4));

    System.out.println("## After adding four hours: " + date);
}
希望有所帮助!

答案 4 :(得分:0)

如果可以的话,我建议您使用JDK8时间API或joda-time 日期的旧java api太糟糕了!

在您的情况下,您可以:

//commons-lang3
Date oldDate = new Date();
Date newDate = DateUtils.addHours(oldDate, 1);

OR

将日期转换为时间戳,添加一些工厂并将时间戳转换回日期

答案 5 :(得分:0)

TL;博士

  • 绝不使用DateSimpleDateFormat类。
  • 仅使用现代 java.time 类。

示例代码:

LocalDateTime.parse(          // Parsing input string to an object without concept of zone or offset.
    "18/01/23 12:34:56" ,     // Input lacking indicator of zone/offset.
    DateTimeFormatter.ofPattern( "uu/MM/dd HH:mm:ss" )  // Define formatting pattern matching your input.
)
.plusHours( 4 )               // Add four hours. Generating a new `LocalDateTime` object, per immutable objects pattern.
.toString()                   // Generate a String in standard ISO 8601 format.
  

2018-01-23T16:34:56

java.time

现代方法使用 java.time 类而不是麻烦的旧遗留日期时间类。切勿使用DateCalendarSimpleDateFormat

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uu/MM/dd HH:mm:ss" ) ;

不分区

显然,您的输入缺少时区指示符或与UTC的偏移量。因此解析为LocalDateTime

LocalDateTime ldt = LocalDateTime.parse( "18/01/23 12:34:56" ) ; 
  

ldt.toString():2018-01-23T12:34:56

LocalDateTime没有time zoneoffset-from-UTC的概念。所以表示实际时刻,并且时间轴上的一个点。 LocalDateTime只是对大约26-27小时范围内潜在时刻的粗略概念。

分区

如果您确定输入数据是为了表示特定区域中的片刻,请应用ZoneId生成ZonedDateTimeZonedDateTime 表示实际时刻,即时间轴上的一个点。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;  // Determining an actual moment.
  

zdt.toString():2018-01-23T12:34:56 + 01:00 [非洲/突尼斯]

要查看UTC中的相同时刻,请提取Instant

Instant instant = zdt.toInstant() ;

数学

表示未附加到时间轴的时间跨度为Duration个对象。

Duration d = Duration.ofHours( 4 ) ;  // Four hours, as an object.

如果不使用时区,请添加到LocalDateTime

LocalDateTime ldtLater = ldt.plus( d ) ;

如果使用分区值,请添加到ZonedDateTime

ZonedDateTime zdtLater = zdt.plus( d ) ; 

如果您愿意,这些类还提供快捷方式。

ZonedDateTime zdtLater = zdt.plusHours( 4 ) ;  // Alternative to using `Duration` object.

使用Duration而不是快捷方法的一个好处是拥有一个可以命名的对象。

Duration halfShiftLater = Duration.ofHours( 4 ) ;
…
ZonedDateTime zdtLater = zdt.plus( halfShiftLater ) ; 

关于 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