java日历范围,包括时间和星期几

von4xj4u  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(360)

我试着检查一个给定的日期是否在星期天晚上10点到星期五晚上10点之间
我想使用日历来实现这一点,我已经写了逻辑上不正确的一小部分代码。我很感激你的帮助

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

我知道上述方法是不对的,我不确定如何去做。谢谢

7jmck4yq

7jmck4yq1#

更新:

我刚刚看到你在评论中提到了以下几点:
如果在星期五晚上10点到星期天晚上10点之间,则返回true
这与你在问题中提到的完全不同:
我试着检查一个给定的日期是否在星期天晚上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);
    }
}

输出:

false
true
true
true
false

原始解决方案:

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。
出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
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);
    }
}

输出:

true
false
false
true
true
false

该解决方案基于以下假设,如果与这些假设中的任何一个有偏差,您应该对其进行调整:
你想在时间里比较日期吗 UTC . 该解决方案将日期时间字符串解析为本地日期时间(没有任何时区信息的日期时间),然后将其转换为 ZonedDateTime 日期时间所属时区的。最后,这个 ZonedDateTime 转换为时间中的日期 UTC .
如果日期时间不在 Sun ,则应在最后一个日期进行比较 Sun 为即将到来的 Fri .
发生的时间 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);
    }
}

输出:

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

输出:

false
true
true
true
false

相关问题