1

開始と終了の2回を保持する小さな時間コンテナを実装したいのですが、特定の時間枠でイベントが発生したかどうかを確認するために、複数の日のイベントを繰り返し使用したいと思います。分/範囲でのみ機能するため、オブジェクトはこの `timeContainer(hour-minutes start、hour-minutes end);にあるように見えます。

時間枠は通常、午後13時から午後13時10分までのように、数分の範囲になります。私が抱えている問題はミリ秒です。これらは静的な最終瞬間を表すため、複数日にわたる反復には使用できません。疑似コードとして使用します。

select events that has happened in the timeframe specified in the constructor  regardless of the day and month,

イベントにはCalendarインスタンスが含まれていますが、時間と分を照合したいのですが、何かアドバイスはありますか?私はjoda-timeでthsiをrechしようとしていますが、これまでのところ方法が見つかりません

ありがとうございました

4

3 に答える 3

2

ミリ秒単位で実行する場合は、1日のミリ秒数でmod(%)を使用します。Joda-timeを使いたい場合は、おそらくもっと読みやすいものが得られるでしょう。以下の例を参照してください。

public class Test {

    static class TimeContainer {
        private static final long second = 1000;
        private static final long minute = 60 * second;
        private static final long hour = 60 * minute;
        private static final long day = 24 * hour;

        private final long starttime;
        private final long endtime;

        public TimeContainer(long startHour, long startMinutes, long endHour, long endMinutes) {
            starttime = startHour * hour + startMinutes * minute;
            endtime = endHour * hour + endMinutes * minute + minute; 
        }

        public boolean test(long timeToTest) {
            long hoursInDay = timeToTest % day;
            return hoursInDay >= starttime && hoursInDay <= endtime;
        }
    }

    static class JodaContainer {
        private final LocalTime starttime;
        private final LocalTime endtime;

        public JodaContainer (LocalTime start, LocalTime end) {
            starttime = start;
            endtime = end;
        }

        public boolean test(long timeToTest) {
            LocalTime lt = new LocalTime(timeToTest);
            return lt.equals(starttime) || lt.equals(endtime) || (lt.isAfter(starttime) && lt.isBefore(endtime));
        }
    }

    public static void main(String[] args) {

        long[] testTimes1 = new long[5];
        long[] testTimes2 = new long[5];

        Calendar test1 = Calendar.getInstance(TimeZone.getTimeZone("Etc/Zulu"));
        Calendar test2 = Calendar.getInstance();

        TimeContainer timeContainer = new TimeContainer(13, 0, 13, 10);
        JodaContainer jodaContainer = new JodaContainer(new LocalTime(13,0), new LocalTime(13,10));

        test1.set(2010, 10, 5, 13, 6, 20);
        test2.set(2010, 10, 5, 13, 6, 20);
        testTimes1[0] = test1.getTimeInMillis();
        testTimes2[0] = test2.getTimeInMillis();

        test1.set(2012, 9, 6, 13, 1, 24);
        testTimes1[1] = test1.getTimeInMillis();
        test2.set(2012, 9, 6, 13, 1, 24);
        testTimes2[1] = test2.getTimeInMillis();

        test1.set(2010, 11, 22, 13, 9, 1);
        testTimes1[2] = test1.getTimeInMillis();
        test2.set(2010, 11, 22, 13, 9, 1);
        testTimes2[2] = test2.getTimeInMillis();

        test1.set(2012, 10, 5, 13, 26, 20);
        testTimes1[3] = test1.getTimeInMillis();
        test2.set(2012, 10, 5, 13, 26, 20);
        testTimes2[3] = test2.getTimeInMillis();

        test1.set(2010, 10, 5, 14, 6, 20);
        testTimes1[4] = test1.getTimeInMillis();
        test2.set(2010, 10, 5, 14, 6, 20);
        testTimes2[4] = test2.getTimeInMillis();

        for (long t : testTimes1) {
            System.out.println(t + "=" + timeContainer.test(t));
        }
        System.out.println();
        for (long t : testTimes2) {
            System.out.println(t + "=" + jodaContainer.test(t));
        }

    }

 }
于 2012-10-22T16:17:27.793 に答える
0

JodaTimeのLocalTimeクラスを本当に使いたいようです。

timeContainer(LocalTime startTime, LocalTime endTime)

LocalTime次に、コードで、完全なイベントごとにを抽出し、それが。の前後DateTimeかどうかを確認する必要があります。startTimeendTime

于 2012-10-22T14:42:56.953 に答える
0

Date.before()またはDate.after()を呼び出して、時刻が範囲内にあるかどうかを確認できます。

boolean isTimeInRange(Calendar startTime, Calendar endTime, Date date ){

            if (date.before(endTime.getTime())
                    && date.after(startTime.getTime())) {

                // time in range
                return true;

            } else {

                return false;

            }

}
于 2012-10-22T14:57:28.113 に答える