簡體   English   中英

JAVA 帶有時間和星期幾的日歷范圍

[英]JAVA Calendar range with time and day of week

我正在嘗試檢查給定日期是否在周日晚上 10 點到周五晚上 10 點之間的范圍內

我想使用 Calendar 來實現這一點,我寫了一小段邏輯上不正確的代碼。 我會很感激這里的一些幫助

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(lastTickTime);
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));

int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
int currentDay = calendar.get(Calendar.DAY_OF_WEEK);

int fromDay = 1;
int toDay = 6;

int fromHour = 22;
int toHour = 22;

boolean result = (currentDay <= fromDay && currentHour < fromHour) || (currentDay >= toDay && currentHour > toHour);

我知道上面的方法是不對的,我不確定如何 go 關於它。 謝謝

更新:

我剛剛看到您在評論中提到了以下內容:

如果在周五晚上 10 點到周日晚上 10 點之間返回真

這與您在問題中提到的(下面給出的)完全不同:

我正在嘗試檢查給定日期是否在周日晚上 10 點到周五晚上 10 點之間的范圍內

我已經為您提供了檢查周日晚上 10 點到周五晚上 10 點之間的日期時間的解決方案(查看原始解決方案部分)。

下面給出的是一周中周五晚上 10 點到周日晚上 10 點之間的日期時間的解決方案:

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(isValidTime("2020-12-25T09:38:08", "America/Chicago"));// Should be false
        System.out.println(isValidTime("2020-12-25T22:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2020-12-26T09:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2020-12-27T09:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2020-12-27T22:38:08", "America/Chicago"));// Should be false
    }

    static boolean isValidTime(String strDateTime, String timezone) {
        ZoneId zoneId = ZoneId.of(timezone);
        ZonedDateTime zdt = LocalDateTime.parse(strDateTime).atZone(zoneId).withZoneSameInstant(ZoneOffset.UTC);
        ZonedDateTime fri10Pm = zdt.with(ChronoField.DAY_OF_WEEK, DayOfWeek.FRIDAY.getValue())
                .with(LocalTime.of(22, 0));
        ZonedDateTime sun10Pm = zdt.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue())
                .with(LocalTime.of(22, 0));
        return zdt.isAfter(fri10Pm) && zdt.isBefore(sun10Pm);
    }
}

Output:

false
true
true
true
false

原始解決方案:

使用java.time (現代日期時間 API):

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(isValidTime("2020-12-25T09:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2020-12-26T09:38:08", "America/Chicago"));// Should be false
        System.out.println(isValidTime("2020-12-27T09:38:08", "America/Chicago"));// Should be false
        System.out.println(isValidTime("2020-12-27T22:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2021-01-01T09:38:08", "America/Chicago"));// Should be true
        System.out.println(isValidTime("2021-01-01T23:38:08", "America/Chicago"));// Should be false
    }

    static boolean isValidTime(String strDateTime, String timezone) {
        ZoneId zoneId = ZoneId.of(timezone);
        ZonedDateTime zdt = LocalDateTime.parse(strDateTime).atZone(zoneId).withZoneSameInstant(ZoneOffset.UTC);
        ZonedDateTime temp = zdt.getDayOfWeek() != DayOfWeek.SUNDAY ? zdt.minusWeeks(1) : zdt;
        ZonedDateTime sun10Pm = temp.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue())
                .with(LocalTime.of(22, 0));
        ZonedDateTime fri10PmNextWeek = temp.plusWeeks(1).with(ChronoField.DAY_OF_WEEK, DayOfWeek.FRIDAY.getValue())
                .with(LocalTime.of(22, 0));
        return zdt.isAfter(sun10Pm) && zdt.isBefore(fri10PmNextWeek);
    }
}

Output:

true
false
false
true
true
false

該解決方案基於以下假設,您應該在偏離任何這些假設的情況下對其進行調整:

  1. 您想比較UTC中的日期時間。 該解決方案將日期時間字符串解析為本地日期時間(沒有任何時區信息的日期時間),然后將其轉換為日期時間所屬時區的ZonedDateTime 最后,此ZonedDateTime被轉換為UTC中的日期時間。
  2. 如果日期時間不在Sun ,則比較應該在從最后一個Sun到即將到來的Fri的日期進行。
  3. 10 pm的時間不包括在內。

附錄:

如果您不必處理時區,而只想檢查給定的日期時間是否在周五晚上 10 點到周日晚上 10 點之間,則可以使用LocalDateTime來完成。

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(isValidTime("2020-12-25T09:38:08"));// Should be false
        System.out.println(isValidTime("2020-12-25T22:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-26T09:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-27T09:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-27T22:38:08"));// Should be false
    }

    static boolean isValidTime(String strDateTime) {
        LocalDateTime ldt = LocalDateTime.parse(strDateTime);
        LocalDateTime fri10Pm = ldt.with(ChronoField.DAY_OF_WEEK, DayOfWeek.FRIDAY.getValue())
                .with(LocalTime.of(22, 0));
        LocalDateTime sun10Pm = ldt.with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue())
                .with(LocalTime.of(22, 0));
        return ldt.isAfter(fri10Pm) && ldt.isBefore(sun10Pm);
    }
}

Output:

false
true
true
true
false

使用舊版 API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        // Test
        System.out.println(isValidTime("2020-12-25T09:38:08"));// Should be false
        System.out.println(isValidTime("2020-12-25T22:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-26T09:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-27T09:38:08"));// Should be true
        System.out.println(isValidTime("2020-12-27T22:38:08"));// Should be false
    }

    static boolean isValidTime(String strDateTime) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        Date date = sdf.parse(strDateTime);

        Calendar calendar = Calendar.getInstance();

        calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        calendar.set(Calendar.HOUR_OF_DAY, 22);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        Date fri10Pm = calendar.getTime();

        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        calendar.set(Calendar.HOUR_OF_DAY, 22);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        Date sun10Pm = calendar.getTime();

        return date.after(fri10Pm) && date.before(sun10Pm);
    }
}

Output:

false
true
true
true
false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM