我试着检查给定的日期是否在周日晚上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);我知道上面的方法是不对的,我不知道该如何去做。谢谢
发布于 2020-12-25 10:17:53
更新:
我刚刚看到你在评论中提到了以下几点:
如果在周五晚上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原解决方案:
java.util的日期时间API和它们的格式化API、SimpleDateFormat已经过时并且容易出错.建议完全停止使用它们,并切换到现代日期时间API。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
falsehttps://stackoverflow.com/questions/65446739
复制相似问题