web-dev-qa-db-ja.com

現在の時間が2時間かどうかを知る方法は?

私には今の時間があります:

new Date();

そして、私はいくつかの時間定数を持っています、例えば、238(午後11時または23:00、午前8時または08:00です)。どうすれば2時間の定数の間の時間になりましたか?

たとえば、現在2時間の間にある場合は、プログラムのコードを実行するか、実行しない必要があります。たとえば、すでに夕方で朝でない場合は、一部のコードを実行しないでください。

ここで説明する画像:

enter image description here

サイレントモードが起動しない状況:

00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!

23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!

01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!

21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
18
Trancer

これを試して

    int from = 2300;
    int to = 800;
    Date date = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
    boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
28
Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date());               //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8)              // Check if hour is between 8 am and 11pm
{
     // do whatever you want
}
11
Holger

Java.time

現代的な方法は、Java 8以降に組み込まれたJava.timeクラスを使用することです。機能の多くは、Java 6&7 ThreeTen-Backportプロジェクト、さらにAndroid ThreeTenABPプロジェクトに適応).

ここではタイムゾーンが重要です。特定の瞬間において、日付と時刻は両方とも世界中でゾーンごとに異なります。

ZoneId z = ZoneId.of( "America/Montreal" );

あなたの現在の瞬間を取得します。

ZonedDateTime zdt = ZonedDateTime.now( z );

時刻を抽出します。名前のLocal部分は、オブジェクト内に含まれるタイムゾーンのno概念があることを意味します。

LocalTime lt = zdt.toLocalTime();

夕方の限界を定義します。

LocalTime start = LocalTime.of( 23 , 0 );  // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 );  // 8 AM.

比較。

  • 新しい日をまたいでいるのか、同じ日をまたいでいるのかを把握する必要があります。 LocalTimeには日付の概念がなく、24時間の一般的な1日のみです。したがって、ケースごとに異なる比較アルゴリズムが必要なため、開始が停止の前か後かをテストする必要があります。開始と終了が等しいかどうかを検討する必要があります。これは、ビジネスルールによっては特別な場合があるためです。

  • 日時作業では、通常、時間の範囲をハーフオープンとして定義します。ここで、開始はinclusiveで、終了はexclusive

これを行う1つの方法を次に示します。

Boolean silentRunning = null ;
if( start.equals( stop ) ) {
    silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) {  // Example 3 PM to 6 PM.
    silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) {  // Example 11 PM to 8 AM.
    silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
    // Error. Should not reach this point. Paranoid check.
}

Java.timeについて

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

Joda-Time プロジェクトは現在 maintenance mode であり、 Java.time クラスへの移行を推奨しています。

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

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

  • Java SE 8 および SE 9 以降
    • 内蔵。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
  • Android
    • ThreeTenABP プロジェクトはThreeTen-Backport(上記)Android具体的には、.
    • 使用方法… を参照してください。

更新:上記は、この回答の新しいバージョンです。以下は古いです。

ジョーダタイム

Joda-Timeライブラリは、日時の作業に関して、Java.util.Dateおよび.Calendarクラスよりもはるかに優れています。

時間帯は、時刻を決定するために重要です。明らかに、「今」はモントリオールよりもパリでの一日の終わりです。

時間の範囲を定義することは、通常、ハーフオープン、[)、ここで、開始は包括的ですが、終了は排他的です。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23  ) && ( hour < 8 ) );
5
Basil Bourque

これはよりクリーンな解決策であり、うまくいくと思います。さまざまな時間パラメーターでテストしました。

        /**
         * @param fromHour Start Time
         * @param toHour Stop Time
         * @param now Current Time
         * @return true if Current Time is between fromHour and toHour
         */
        boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
            //Start Time
            Calendar from = Calendar.getInstance();
            from.set(Calendar.HOUR_OF_DAY, fromHour);
            from.set(Calendar.MINUTE, 0);
            //Stop Time
            Calendar to = Calendar.getInstance();
            to.set(Calendar.HOUR_OF_DAY, toHour);
            to.set(Calendar.MINUTE, 0);

            if(to.before(from)) {
                if (now.after(to)) to.add(Calendar.DATE, 1);
                else from.add(Calendar.DATE, -1);
            }
            return now.after(from) && now.before(to);
        }
4
sytolk

チュートリアルを見ることができます ここ with Date.beforeそしてDate.after

また、ミリ秒を取得して比較することもできます。

2
user529543

これは、現在(現在の時間)が1から4の間であるかどうかをチェックする関数ですOR 4から8 OR 8から12 OR 12から16 OR 16から20 OR 20から1そして、次の正確な時間を返します。

private Calendar GetTimeDiff() throws ParseException {
    Calendar now = Calendar.getInstance();

    Calendar one = Calendar.getInstance();
    one.set(Calendar.HOUR_OF_DAY, 1);
    one.set(Calendar.MINUTE, 0);
    one.set(Calendar.SECOND, 0);

    Calendar four = Calendar.getInstance();
    four.set(Calendar.HOUR_OF_DAY, 4);
    four.set(Calendar.MINUTE, 0);
    four.set(Calendar.SECOND, 0);

    Calendar eight = Calendar.getInstance();
    eight.set(Calendar.HOUR_OF_DAY, 8);
    eight.set(Calendar.MINUTE, 0);
    eight.set(Calendar.SECOND, 0);

    Calendar twelve = Calendar.getInstance();
    twelve.set(Calendar.HOUR_OF_DAY, 12);
    twelve.set(Calendar.MINUTE, 0);
    twelve.set(Calendar.SECOND, 0);

    Calendar sixteen = Calendar.getInstance();
    sixteen.set(Calendar.HOUR_OF_DAY, 16);
    sixteen.set(Calendar.MINUTE, 0);
    sixteen.set(Calendar.SECOND, 0);

    Calendar twenty = Calendar.getInstance();
    twenty.set(Calendar.HOUR_OF_DAY, 20);
    twenty.set(Calendar.MINUTE, 0);
    twenty.set(Calendar.SECOND, 0);

    if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {
        return four;
    }

    if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {
        return eight;
    } 

    if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {
        return twelve;
    } 

    if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {
        return sixteen;
    } 

    if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {
        return twenty;
    } 

    if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {
        return one;
    }

    return now;
}
0
Dileep