2012-06-21 3 views
11

JavaでcompareToメソッドを使用して、特定の日付が別の日付の24時間以上かどうかを確認しています。日付が正確に24時間以上あるかどうかを調べる

どのように日付を比較する整数を決定するのですか?

+5

をチェックするのに役立ちますか?あなたは24時間、1カレンダー日を意味しますか、それとも「隣接する24時間セグメント」を意味しますか? – cheeken

+1

私はそれが翌日であるかどうかをチェックしたくないので、正確に24時間後かそれ以上であるかどうかチェックしたいと思います。 –

+0

GregorianCalendarクラスについてどう思いますか? – 11684

答えて

7

で答えはあなたが達成したいことに依存します。

片方向の違いは、ミリ秒単位で確認できます。ミリ秒単位で24時間は(ミリ秒単位で表される)2つの日付の差がある場合は、単に確認することができるようになりました

を(あなたはまた、IMOより説明的であるTimeUnit.HOURS.toMillis(24)を書くことができ、コード内)

24 * 60 * 60 * 1000 = 86400000 
h  min sec millis 

を経由して計算することができ86400000.

+2

'int'ではなく、' long'算術ですべてを行うことを忘れないでください。 –

+0

ユニットを使用する場合は、ユニットを正しく使用してください。今、あなたが所有しているユニットはt^5にあります。 –

+1

@DaftPunk誤った使い方はどういう意味ですか? '86400000'は' int'の範囲です。また、 'longLength'と' someLong1 - someLong2> someInt'のように 'long'と' int'を比較することで問題はありません。 – Pshemo

13

Calendarクラスを使用してください。すでにDateオブジェクトを持っている場合、あなたはまだCalendarを使用することができます。

Date aDate = . . . 
Calendar today = Calendar.getInstance(); 
today.setTime(aDate); 
Calendar tomorrow = Calendar.getInstance(); 
tomorrow.setTime(aDate); 
tomorrow.add(Calendar.DAY, 1); 
Date tomorrowDate = tomorrow.getTime(); // if you need a Date object 
+2

あなたはカレンダーを使用し、日付からカレンダーに変換する方法を示しますが、あるカレンダーが他のカレンダーに続いているかどうかを確認するにはどうすればよいですか?未解決のままです。私はカレンダーが今日か前日かをチェックする必要があるので、あなたもそれに答えることができればそれはいいだろう。 –

+1

@YekhezkelYovel - これは簡単です。 'Calendar'は' Comparable'を実装しているので、 'cal1.compareTo(cal2)'を使ってどちらのカレンダーの後ろにあるかを知ることができます。 'cal1'が' cal2'の前の時刻を表し、 'positive'は' cal2'の前の時刻を表します。 –

+2

些細なことでもありませんが、それはあなたがあなたの答えにそれを含めるべきであったので、菅野が言ったことです。 1日前の日付かどうかのチェックについて(比較を除く)この投稿が見つかりましたhttp://stackoverflow.com/questions/2517709/java-comparing-two-dates-to-see-if-they-are-in-同じ日に便利です。 –

0

日付の間のデルタを見つけるには:具体的には短い、

long endL = end.getTimeInMillis() + end.getTimeZone().getOffset(end.getTimeInMillis()); 
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis()); 
return (endL - startL)/MILLISECS_PER_DAY; 

http://user.xmission.com/~goodhill/dates/deltaDates.html

3

TLより大きい; DR

myUtilDate_B 
    .toInstant() 
    .equals( 
     myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS) 
    ) // Exactly 24 hours apart. 

...と...

myUtilDate_B 
    .toInstant() 
    .isAfter( 
     myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS) 
    ) // Over 24 hours apart. 

はまた...あなたは、特にどちらかどうか尋ねるために2つの日付・時刻を比較するために頼ま

Duration.between(myUtilDate_A , myUtilDate_B) 
     .compareTo(Duration.ofHours(24)) 
     // Returns 0 if exactly 24 hours apart, 
     //   >0 if over 24 hours apart. 

java.time

  • は正確に24時間後に別の
  • より1です
  • 1つは24時間後に別のものよりも後です。

上記のcompareTo方法はこれを行いません。それは、瞬間が同じか、遅いか、早いかを単に伝えるように設計されています。この方法では、24時間などの特定の時間範囲は考慮されません。

あなたは特に、日付は問題ではないと述べました。だから、夏時間(DST)のような異常を無視して、1日を24時間より長くまたは短くしたいとします。

UTCで作業できます。タイムゾーンは不要です。

java.util.Dateオブジェクトを参照している場合は、まずオブジェクトをjava.timeオブジェクトに変換します。 Dateクラスは、厄介な古い日時クラスの一部で、Calendarと一緒になっています。これは、現在はレガシーで、java.timeクラスに取って代わられています。

java.util.Dateに相当するのはjava.time.Instantです。 Instantクラスは、nanoseconds(小数点以下9桁まで)の解像度を持つUTCのタイムライン上の瞬間を表します。

古いクラスに追加された新しいメソッドを使用して、java.time型に/からjava.time型に変換できます。

Instant start = myUtilDate_Start.toInstant(); 
Instant stop = myUtilDate_Stop.toInstant(); 

Durationオブジェクトとして、この場合は24時間、我々は気にギャップを定義します。

Duration d = Duration.ofHours(24); // We mean literally 24 hours, not a day. 

Durationを使用して、24時間後の値を計算します。時間単位はChronoUnit enumで定義します。

Instant target = start.plus(24 , ChronoUnit.HOURS); 

最後に、2番目の日時の値を比較します。 equalsisAfterに電話してください。

Boolean isExactly24HoursLater = stop.equals(target); 
Boolean isOver24HoursLater = stop.isAfter(target); 

java.timeについて

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

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。


ジョダタイム

UPDATE:Joda-Timeプロジェクト、今maintenance modeで、java.timeクラスへの移行をアドバイスします。このセクションは、歴史のためにここに残されています。

Joda-Timeは、この作業を容易にします。

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime dateTimeInQuestion = new DateTime(2014, 1, 2, 3, 4, 5, 6, timeZone); // Or: new DateTime(someJavaDotUtilDotDateObject); 
DateTime now = new DateTime(timeZone); 
DateTime twentyFourHoursFromNow = now.plusHours(24); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays(1) instead. 
DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter(twentyFourHoursFromNow); 

1日≠24時間あなたは本当に、次の日の同じwall-clock time考えるplusHours(24)ではなくplusDays(1)を呼び出すことを意図した場合

。 Joda-Timeは夏時間(DST)やその他の異常を調整します。たとえば、米国では、1時間のDSTの愚かさのために、24時間ではなく25時間を意味する可能性があります。

は、24時間、本当に問題の土地の日付・時刻が内時間の24時間のスパンは、時間のスパンのためジョダ時の三つのクラスのいずれかを使用することかどうかをテストすることを意図している場合

内での比較します:間隔、期間、および期間。

Interval interval = new Interval(now, twentyFourHoursFromNow); 
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains(dateTimeInQuestion); 

このような比較のため、Joda-Timeは「Half-Open」ロジックを使用しています。つまり、開始日時は)ですが、末尾は)です。言い換えれば、より大きいまたは等しい(> =)開始を比較するが、より短い(<)終了を比較する。このアプローチは通常、日時で作業するときに最も効果的です。

1

これは、あなたが明確にすることができ、あなたの日付が昨日だった場合

public static final long ONE_MINUTE = 60 * 1000; 
public static final long ONE_HOUR = 60 * ONE_MINUTE; 
public static final long ONE_DAY = 24 * ONE_HOUR; 

public static boolean isYesterday(Date d) { 
    return DateUtils.isToday(d.getTime() + ONE_DAY); 
} 
0
あなたの活動のOnCreateで

//Get current date - yymmdd increases only 
    SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd"); 
    Date now = new Date(); 
    int nowTime= Integer.parseInt(formatter.format(now)); 

    //Get last login date - stored in db 
    int lastLogin= dbManager.getLastLoginDate(); 

    //Check if next day 
    if(nowTime> lastLogin){ 

     //Do your stuff 
     //Update last login date 
     dbManager.saveLoginDate(nowTime); 
    } 
関連する問題