我有一个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)
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)
Bas*_*que 14
在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 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 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
,和更多.
使用日历.
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
Run Code Online (Sandbox Code Playgroud)
或者使用着名的Joda Time图书馆:
DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Run Code Online (Sandbox Code Playgroud)