Javaの日付を1時間前に変更する


124

私はJavaの日付オブジェクトを持っています:

Date currentDate = new Date();

これにより、現在の日付と時刻がわかります。例:

Thu Jan 12 10:17:47 GMT 2012

代わりに、日付を取得して1時間前に戻したいので、次のようになります。

Thu Jan 12 09:17:47 GMT 2012

それを行う最善の方法は何でしょうか?


mktimeJava には同等のものはありますか?それから60分を差し引きますか?
Shiplu Mokaddim 2012年

回答:


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
:ちょうど24時間時計のために午前と午後とCalendar.HOUR_OF_DAYで動作Calendar.HOURがあるという事実を変わることchintat.blogspot.ca/2006/05/...
ウルフ

時刻が1日の午前0時で、前日の午後11時を1時間早くしたい場合、カレンダーを使用した最初のソリューションは機能しますか?
ジョージアロキアム2018

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カレンダーは、私が見つけるほとんどの例ではやりすぎです。
Peter Lawrey

2
@Stoanより読みやすい例を追加しました。カレンダーは信じられないほど非効率的です。
Peter Lawrey

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); 10分遅れる?
Siya Sosibo 2016年

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 [アメリカ/モントリオール]

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

…または…

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

java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

java.timeクラスはどこで入手できますか?

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


こんにちは、私はまだインスタントの「時間前」を作る適切な方法を見つけることができません。
Ticherhaz



5

日付から1時間のミリ秒数を引くだけです。

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

@マッキー:私は物事が変わったことを知っています。しかし、それは間違った答えではありません!!! なぜこれを間違った答えにするのですか?受け入れられた回答を完全に見ましたか?
ゼニス2017年

1
5歳で、回答を受け入れた質問に答えるのはなぜですか。
Makky、2017年

この回答は、既存の数年前の回答を超える価値はありません。そして、このAnswerは、java.timeクラスに何年も取って代わられてきた恐ろしい古い日時クラスを賢く使用していません。別の問題:この回答はタイムゾーンの問題を無視し、GMT / UTCを要求する質問に対して、JVMの現在のデフォルトのタイムゾーンを使用するコードを示しています。詳細については、Kimiによる正しい解答の後の部分を参照するか、私の解答を参照しください。
バジルブルク

-1

代わりにformatを使用しました。時間を操作するには、parseおよびtoString()メソッドを使用するだけです

String localTime = "6:11"; LocalTime localTime = LocalTime.parse(localtime)

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


1
この回答は質問には対応していません。質問は、時間だけではありません。
バジルブルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.