一小时后更改Java日期


124

我有一个Java日期对象:

Date currentDate = new Date();

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

Thu Jan 12 10:17:47 GMT 2012

相反,我想获取日期,将其改回一小时,这样它应该给我:

Thu Jan 12 09:17:47 GMT 2012

最好的方法是什么?


mktimejava中有任何等效的东西吗?减去60分钟吗?
Shiplu Mokaddim 2012年

Answers:


243

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

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8:java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

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

8
只是事实有所不同,有Calendar.HOUR可以使用12小时制,而Calendar.HOUR_OF_DAY可以使用24小时制:chintat.blogspot.ca/2006/05/…–
Wolf

如果时间是一天的午夜,并且您想提前一个小时(前一天的晚上11点)使用日历,第一个解决方案是否可以工作?
乔治·阿罗基姆

1
@GeorgeArokiam是的
Kimi

66

类似于@Sumit Jain的解决方案

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

要么

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
更好的解决方法。在此特定应用程序中,日历实例的创建看起来有些过头了。
www.Decompiler.com 2013年

2
在我发现的大多数示例中,@ cosmolev日历都是过大的。
彼得·劳瑞

2
@Stoan我添加了一个更具可读性的示例。您应注意,日历效率极低。
彼得·劳瑞

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); 这应该落后10分钟吗?
Siya Sosibo '16

15

tl; dr

UTC中

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

或分区:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

使用java.time

Java 8和更高版本具有内置的新java.time框架。

Instant

如果您只关心UTC(GMT),请使用Instant该类。

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

转储到控制台。

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

即时:2015-10-29T00:37:48.921Z | InstantHourEarlier:2015-10-28T23:37:48.921Z

请注意在此瞬间是如何跳回到昨天的日期的。

ZonedDateTime

如果您关心时区,请使用ZonedDateTime该类。您可以从即时开始,然后分配一个时区,一个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 );

转储到控制台。

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

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

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

zdtHour更早的时间: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 );

…要么…

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

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和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中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


您好先生,我仍然找不到为Instant设置“时间前”的正确方法。
Ticherhaz

9

使用日历

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);

7

或使用著名的Joda Time库:

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

5

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

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


4

您可以在下面的代码中输入日期和时间:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

输出:

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

这个连结很好:请看这里

看:也看

并且:这里

并且:这里

并且:这里

如果您只需要时间:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

2
仅供参考:此答案使用麻烦的旧日期时间类,这些类现在已被遗留,由现代的java.time类取代。
罗勒·布尔克

0

可以使用来实现java.util.Date。以下代码将从您的日期中减去1小时。

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

同样,从您的日期减去20秒

newDate = DateUtils.addSeconds(date, -20)    

-1

获取以毫秒为单位的时间,减去以毫秒为单位的分钟,然后将其转换为日期。在这里,您需要物化一个!!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@Makky:我知道情况已经变了。但这不是一个错误的答案!!!您为什么告诉这个错误答案?您是否完全看到了接受的答案?
真力时(Zenith)

1
您为什么还要回答已有5年历史并接受了答案的问题。
Makky

除了已有多年的答案,此答案没有任何价值。并且此答案不明智地使用了java.time类已经取代了多年的可怕的旧日期时间类。另一个问题:此答案忽略时区问题,并显示在“问题”询问GMT / UTC时将使用JVM当前默认时区的代码。请参阅Kimi正确答案的后面部分,或参阅我的答案以获取更多讨论。
罗勒·布尔克

-1

它对我有用,而不是使用format。要使用时间,只需使用parse和toString()方法

字符串localTime =“ 6:11”; LocalTime localTime = LocalTime.parse(本地时间)

LocalTime lt = 6:11; localTime = lt.toString()


1
该答案未解决该问题。问题不仅仅是一个时间上的问题。
罗勒·布尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.