一小时后更改Java日期

Mak*_*kky 108 java date

我有一个Java日期对象:

Date currentDate = new Date();
Run Code Online (Sandbox Code Playgroud)

这将给出当前的日期和时间.例:

Thu Jan 12 10:17:47 GMT 2012
Run Code Online (Sandbox Code Playgroud)

相反,我想得到日期,将其更改为一小时后它应该给我:

Thu Jan 12 09:17:47 GMT 2012
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

Kim*_*imi 208

java.util.Calendar中

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();
Run Code Online (Sandbox Code Playgroud)

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);
Run Code Online (Sandbox Code Playgroud)

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)
Run Code Online (Sandbox Code Playgroud)

Java 8:java.time.LocalDateTime

LocalDateTime.now().minusHours(1)
Run Code Online (Sandbox Code Playgroud)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));
Run Code Online (Sandbox Code Playgroud)

  • 只是有不同的事实,有Calendar.HOUR工作12小时时钟和Calendar.HOUR_OF_DAY 24小时时钟:http://chintat.blogspot.ca/2006/05/calendarhour-vs-calendarhourofday.html (6认同)

Pet*_*rey 60

与@Sumit Jain的解决方案类似

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);
Run Code Online (Sandbox Code Playgroud)

要么

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Run Code Online (Sandbox Code Playgroud)

  • 更好的解决方案.在这个特定的应用程序中,日历实例创建看起来有点过分. (2认同)
  • @cosmolev在我找到的大多数例子中,日历都是过度的. (2认同)
  • @Stoan我添加了一个更具可读性的例子.你应该注意到Calendar非常低效. (2认同)

Bas*_*que 14

TL;博士

UTC中:

Instant.now().minus( 1 , ChronoUnit.HOURS ) 
Run Code Online (Sandbox Code Playgroud)

或者,划分:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )
Run Code Online (Sandbox Code Playgroud)

使用java.time

Java 8及更高版本内置了新的java.time框架.

Instant

如果您只关心UTC(GMT),那么请使用该Instant课程.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
Run Code Online (Sandbox Code Playgroud)

时间:2015-10-29T00:37:48.921Z | instantHourEarlier:2015-10-28T23:37:48.921Z

注意在这一瞬间发生的事情是如何跳回到昨天的日期.

ZonedDateTime

如果您关心时区,请使用该ZonedDateTime课程.您可以从Instant开始并分配时区,即ZoneId对象.此类处理异常情况的必要调整,例如夏令时(DST).

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );
Run Code Online (Sandbox Code Playgroud)

时刻:2015-10-29T00:50:30.778Z

zdt:2015-10-28T20:50:30.778-04:00 [美国/蒙特利尔]

zdtHourEarlier:2015-10-28T19:50:30.778-04:00 [美国/蒙特利尔]

转变

旧的java.util.Date/.Calendar类现在已经过时了.避免他们.众所周知,它们很麻烦,令人困惑.

如果必须使用旧类来操作尚未针对java.time类型更新的旧代码,请调用转换方法.以下是从Instant或ZonedDateTime到java.util.Date的示例代码.

java.util.Date date = java.util.Date.from( instant );
Run Code Online (Sandbox Code Playgroud)

…要么…

java.util.Date date = java.util.Date.from( zdt.toInstant() );
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


ada*_*shr 9

使用日历.

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
Run Code Online (Sandbox Code Playgroud)


Jea*_*art 7

或者使用着名的Joda Time图书馆:

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Run Code Online (Sandbox Code Playgroud)


Sum*_*ain 5

只需从日期中减去一小时内的毫秒数.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));