java - 如何检查给定时间是否在提到的时间范围内
问题描述
我想检查我的日期值是否来自 -
Date d = convertCurrentTimeToSpecificTimeZone("America/Chicago", 2, 30);
在上午 10 点到下午 6 点之间。
我在 StackOverflow类似问题上找到了一些类似的链接,并使用了该线程中的一些代码。
我只想检查任何时区的当前时间是否在上午 10 点到下午 6 点之间。如果是,则打印“是”,否则打印“否”。
目前用于以下代码:
String string1 = "10:11:13";
Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);
calendar1.add(Calendar.DATE, 1);
System.out.println(calendar1.getTime().toString());
它只打印 1970 年的上午 10:11 时间。像这样 - 1970 年 1 月 2 日星期五 10:11:13 IST。
但我想检查今天或任何未来的日期时间是否在上午 10 点到下午 6 点之间。
下面是代码参考:
public static Date convertCurrentTimeToSpecificTimeZone(String timeZone, int increaseDateBy,
int increaseMinutesBy) {
Calendar calendar = Calendar.getInstance();
TimeZone fromTimeZone = calendar.getTimeZone();
TimeZone toTimeZone = TimeZone.getTimeZone(timeZone);
calendar.setTimeZone(fromTimeZone);
calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
if (fromTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
}
calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
if (toTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
}
increaseCalenderDateBy(calendar, increaseDateBy);
increaseCalenderMinuteBy(calendar, increaseMinutesBy);
return calendar.getTime();
}
public static void getTimeBetweenRange() throws ParseException {
String string1 = "10:11:13";
Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);
calendar1.add(Calendar.DATE, 1);
System.out.println(calendar1.getTime().toString());
String string2 = "18:49:00";
Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(time2);
calendar2.add(Calendar.DATE, 1);
System.out.println(calendar2.getTime().toString());
Date d = convertCurrentTimeToSpecificTimeZone("America/Chicago", 2, 30);
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(d);
System.out.println(calendar3.getTime().toString());
Date x = calendar3.getTime();
if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
// checkes whether the current time is between 14:49:00 and 20:11:13.
System.out.println(true);
} else
System.out.println(false);
}
所以我下面代码的输出是:
Fri Jan 02 10:11:13 IST 1970
Fri Jan 02 18:49:00 IST 1970
Fri Jan 31 03:15:07 IST 2020
解决方案
这不是很清楚。对于这个答案,我假设您的所有时间都将在美国/芝加哥时区进行理解。如果这不是您想要的,请还原。
java.time
ZoneId zone = ZoneId.of("America/Chicago");
ZonedDateTime zdt = ZonedDateTime.now(zone).plusDays(2).plusMinutes(30);
LocalTime rangeStart = LocalTime.parse("10:11:13");
LocalTime rangeEnd = LocalTime.parse("18:49:00");
LocalTime time = zdt.toLocalTime();
if (!time.isBefore(rangeStart) && time.isBefore(rangeEnd)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
当我刚才(芝加哥时间 11:30)运行此代码段时,输出为:
是的
我正在使用现代 Java 日期和时间 API java.time,并建议您也这样做。它比旧的、过时的和设计不佳的类Date
、SimpleDateFormat
和.Calendar
TimeZone
ALocalTime
是一天中从 00:00(含)到 24:00(不含)的时间。通过比较LocalTime
对象,我们忽略了日期,并且对于 1970 年或历史上其他时间的不相关日期没有任何问题。
编辑:
还有可能获取 rangeStart 和 rangeEnd 的日期和时间,以验证我们正在检查条件的特定日期和时间吗?
不,那没有意义。由于 a是没有 dateLocalTime
的一天中的时间,因此无法从中获取日期。但是您可以打印并验证其日期部分。为了确保代码是正确的,编写一些单元测试。ZonedDateTime
链接: Oracle 教程:解释如何使用 java.time 的日期时间。
推荐阅读
- javascript - SharePoint javascript 搜索列表
- python - 熊猫数据帧按月计数,但按值细分
- xml - 编辑配置值 Powershell
- jenkins - 用于运行作业的 Jenkins 完整工作区链接 - 链接到我的作业创建的屏幕截图
- powerbi - 视觉级别过滤器等于列值
- javascript - 记录未更新 ASP.NET Ajax
- jquery - 仅适用于有效日期和 MM/DD/YYYY 格式的 JQuery 日期验证
- javascript - 在没有递归/承诺的情况下无限期重复异步功能
- javascript - 如何在我的视图和所有屏幕中居中我的 react-native svg
- python - 为什么我的 PySpark 数据框连接操作写入空结果?