如何检查一天中的时间是否在两次之间?
How to check if time in day is between two times?
在我的应用程序中,我创建了一个代表高中的对象 class。该对象包含 2 个 Calendar 对象,表示 class 每天的开始和结束时间。当用户创建作业时,我想检查当前时间是否在任何 classes 的两次之间。如果是,我知道作业是在 class 期间创建的。这是我当前的代码不起作用,因为 .getTime() returns 日期包括月和日,而我只想比较小时和分钟。那么我如何 trim 返回的日期只包括一天中的时间?使用 joda-time 会更容易吗?如果是这样,应该使用什么 classes?
public void checkTimeFrame() {
time = Calendar.getInstance().getTime();
ArrayList<SchoolClass> mList = mClassList;
// Changes index if assignment falls under time frame of class
for (int a = 0; a < mList.size(); a++) {
if (mList.get(a).getStartTime() != null && mList.get(a).getEndTime() != null &&
time.after(mList.get(a).getStartTime().getTime()) && time.before(mList.get(a)
.getEndTime().getTime())) {
index = a;
updateClassEditText();
}
}
}
日历 class 有一个 get
方法,您可以在其中 get
不同的字段
例如
int hr = time.get(Calendar.HOUR_OF_DAY)
您可以使用 Calendar.get()
,如另一个答案中所述。不过,要比较分钟数,您也应该使用 Calendar.MINUTE
:
int minutes_in_day = time.get(Calendar.HOUR_OF_DAY)*60 + time.get(Calendar.MINUTE);
然后,您可以将当前时间的一天中的分钟数与开始时间和结束时间的分钟数进行比较。当然,这只适用于同一天的时间。
我这里只提供你要的Joda-Time相关的答案。 Joda-Time 的优势在于为时钟时间提供专用类型,即 LocalTime。旧的 java.util.Calendar
-stuff 不提供这个优势因此你的困难。
首先你转换 java.util.Date
的实例如下:
Date time = ...;
DateTime dt = new DateTime(time, DateTimeZone.getDefault());
LocalTime lt = dt.toLocalTime();
请注意,转换始终取决于时区。然后您可以使用继承方法 isAfter(...)
或 isBefore(...)
.
比较两个 LocalTime
实例
try {
Date date1 = sdf.parse(given time);
Date date2 = sdf.parse("08:00 AM");
Date date3 = sdf.parse("06:00 PM");
if((date1.after(date2))&&(date1.before(date3))||date1.equals(date2) ||date1.equals(date3) ) {
}
} catch (ParseException e){
e.printStackTrace();
}
JDK 8 日期时间 API 是解决此类问题的好方法。而不是 Calendar ,使用 LocalTime 来存储 class.
的开始和结束时间
LocalTime now = LocalTime.now(ZoneId.systemDefault());
LocalTime start = mList.get(a).getStartTime();
LocalTime end = mList.get(a).getEndTime();
if(now.isAfter(start) && now.isBefore(end)){
//do something
}
对于 Android,您可以使用 ThreeTenABP 项目,该项目为 Android 改编了 java.time API。
在我的应用程序中,我创建了一个代表高中的对象 class。该对象包含 2 个 Calendar 对象,表示 class 每天的开始和结束时间。当用户创建作业时,我想检查当前时间是否在任何 classes 的两次之间。如果是,我知道作业是在 class 期间创建的。这是我当前的代码不起作用,因为 .getTime() returns 日期包括月和日,而我只想比较小时和分钟。那么我如何 trim 返回的日期只包括一天中的时间?使用 joda-time 会更容易吗?如果是这样,应该使用什么 classes?
public void checkTimeFrame() {
time = Calendar.getInstance().getTime();
ArrayList<SchoolClass> mList = mClassList;
// Changes index if assignment falls under time frame of class
for (int a = 0; a < mList.size(); a++) {
if (mList.get(a).getStartTime() != null && mList.get(a).getEndTime() != null &&
time.after(mList.get(a).getStartTime().getTime()) && time.before(mList.get(a)
.getEndTime().getTime())) {
index = a;
updateClassEditText();
}
}
}
日历 class 有一个 get
方法,您可以在其中 get
不同的字段
例如
int hr = time.get(Calendar.HOUR_OF_DAY)
您可以使用 Calendar.get()
,如另一个答案中所述。不过,要比较分钟数,您也应该使用 Calendar.MINUTE
:
int minutes_in_day = time.get(Calendar.HOUR_OF_DAY)*60 + time.get(Calendar.MINUTE);
然后,您可以将当前时间的一天中的分钟数与开始时间和结束时间的分钟数进行比较。当然,这只适用于同一天的时间。
我这里只提供你要的Joda-Time相关的答案。 Joda-Time 的优势在于为时钟时间提供专用类型,即 LocalTime。旧的 java.util.Calendar
-stuff 不提供这个优势因此你的困难。
首先你转换 java.util.Date
的实例如下:
Date time = ...;
DateTime dt = new DateTime(time, DateTimeZone.getDefault());
LocalTime lt = dt.toLocalTime();
请注意,转换始终取决于时区。然后您可以使用继承方法 isAfter(...)
或 isBefore(...)
.
LocalTime
实例
try {
Date date1 = sdf.parse(given time);
Date date2 = sdf.parse("08:00 AM");
Date date3 = sdf.parse("06:00 PM");
if((date1.after(date2))&&(date1.before(date3))||date1.equals(date2) ||date1.equals(date3) ) {
}
} catch (ParseException e){
e.printStackTrace();
}
JDK 8 日期时间 API 是解决此类问题的好方法。而不是 Calendar ,使用 LocalTime 来存储 class.
的开始和结束时间LocalTime now = LocalTime.now(ZoneId.systemDefault());
LocalTime start = mList.get(a).getStartTime();
LocalTime end = mList.get(a).getEndTime();
if(now.isAfter(start) && now.isBefore(end)){
//do something
}
对于 Android,您可以使用 ThreeTenABP 项目,该项目为 Android 改编了 java.time API。