My *_*God 41 java android calendar timespan date
我有时间跨度:
String time1 = 01:00:00
String time2 = 05:00:00
我想检查time1和time2是否介于两者之间20:11:13 and 14:49:00.
实际上,01:00:00大于20:11:13和小于14:49:00考虑20:11:13总是小于14:49:00.这是先决条件.
所以我想要的是,20:11:13 < 01:00:00 < 14:49:00.
所以我需要这样的东西:
public void getTimeSpans()
{
boolean firstTime = false, secondTime = false;
if(time1 > "20:11:13" && time1 < "14:49:00")
{
firstTime = true;
}
if(time2 > "20:11:13" && time2 < "14:49:00")
{
secondTime = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这个代码没有给出正确的结果,因为我正在比较字符串对象.
怎么做,因为他们是时间跨度而不是比较的字符串?
Kon*_*kov 46
您可以使用Calendar该类进行检查.
例如:
try {
String string1 = "20:11:13";
Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);
calendar1.add(Calendar.DATE, 1);
String string2 = "14:49:00";
Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(time2);
calendar2.add(Calendar.DATE, 1);
String someRandomTime = "01:00:00";
Date d = new SimpleDateFormat("HH:mm:ss").parse(someRandomTime);
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(d);
calendar3.add(Calendar.DATE, 1);
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);
}
} catch (ParseException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 26
20:11:13 <01:00:00 <14:49:00
LocalTime target = LocalTime.parse( "01:00:00" ) ;
Boolean targetInZone = (
target.isAfter( LocalTime.parse( "20:11:13" ) )
&&
target.isBefore( LocalTime.parse( "14:49:00" ) )
) ;
Run Code Online (Sandbox Code Playgroud)
java.time.LocalTimejava.time类包括LocalTime仅表示没有日期且没有时区的时间.
所以我想要的是,20:11:13 <01:00:00 <14:49:00.
首先,我们定义边界.您的输入字符串恰好符合标准ISO 8601格式.默认情况下,java.time类使用ISO 8601格式,因此无需指定格式设置模式.
LocalTime start = LocalTime.parse( "20:11:13" );
LocalTime stop = LocalTime.parse( "14:49:00" );
Run Code Online (Sandbox Code Playgroud)
并定义我们的测试用例,即目标01:00:00.
LocalTime target = LocalTime.parse( "01:00:00" );
Run Code Online (Sandbox Code Playgroud)
现在我们设置比较这些LocalTime对象.我们想看看目标是在较晚时间之后但在较早时间之前.这意味着在这种情况下半夜,第二天早上大约晚上8点到凌晨3点之间.
Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ;
Run Code Online (Sandbox Code Playgroud)
该测试可以更简单地说" 不在凌晨3点到晚上8点之间".然后,我们可以推广到任何一对LocalTime对象,我们在这两个对象之间进行测试,如果开始是在24小时制停止之前,而不是在停止之后是否开始(如本问题的情况).
此外,时间跨度通常采用半开放式方法处理,其中开头是包含在内的,而结尾是独占的.因此,严格地说,"之间"比较将是"目标等于或晚于开始并且目标在停止之前",或者更简单地说,"目标不是在开始之前和停止之前".
Boolean isBetweenStartAndStopStrictlySpeaking =
( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ;
Run Code Online (Sandbox Code Playgroud)
如果开始是在停止之后,在24小时内,则假设我们想要问题中建议的逻辑(在晚上8点之后但在凌晨3点之前).
if( start.isAfter( stop ) ) {
return ! isBetweenStartAndStopStrictlySpeaking ;
} else {
return isBetweenStartAndStopStrictlySpeaking ;
}
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.
Sur*_*ali 18
@kocko给出的答案仅在同一天起作用.
如果开始时间"23:00:00"并且结束"02:00:00" [第二天]并且当前时间是"01:30:00"那么结果将是假的...
我修改了@ kocko的答案以完美地工作
public static boolean isTimeBetweenTwoTime(String initialTime, String finalTime,
String currentTime) throws ParseException {
String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
if (initialTime.matches(reg) && finalTime.matches(reg) &&
currentTime.matches(reg))
{
boolean valid = false;
//Start Time
//all times are from java.util.Date
Date inTime = new SimpleDateFormat("HH:mm:ss").parse(initialTime);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(inTime);
//Current Time
Date checkTime = new SimpleDateFormat("HH:mm:ss").parse(currentTime);
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(checkTime);
//End Time
Date finTime = new SimpleDateFormat("HH:mm:ss").parse(finalTime);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(finTime);
if (finalTime.compareTo(initialTime) < 0)
{
calendar2.add(Calendar.DATE, 1);
calendar3.add(Calendar.DATE, 1);
}
java.util.Date actualTime = calendar3.getTime();
if ((actualTime.after(calendar1.getTime()) ||
actualTime.compareTo(calendar1.getTime()) == 0) &&
actualTime.before(calendar2.getTime()))
{
valid = true;
return valid;
} else {
throw new IllegalArgumentException("Not a valid time, expecting
HH:MM:SS format");
}
}
}
Run Code Online (Sandbox Code Playgroud)
产量
"07:00:00" - "17:30:00" - "15:30:00" [current] - true
"17:00:00" - "21:30:00" - "16:30:00" [current] - false
"23:00:00" - "04:00:00" - "02:00:00" [current] - true
"00:30:00" - "06:00:00" - "06:00:00" [current] - false
Run Code Online (Sandbox Code Playgroud)
(我已将下限值包含在[上限值-1]中)
Jit*_*Dev 16
修改了@Surendra Jnawali'代码.它失败
如果当前时间是23:40:00,即大于开始时间且小于等于23:59:59.
所有信用都归于真正的所有者
这应该是这样的:这很完美
public static boolean isTimeBetweenTwoTime(String argStartTime,
String argEndTime, String argCurrentTime) throws ParseException {
String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
//
if (argStartTime.matches(reg) && argEndTime.matches(reg)
&& argCurrentTime.matches(reg)) {
boolean valid = false;
// Start Time
java.util.Date startTime = new SimpleDateFormat("HH:mm:ss")
.parse(argStartTime);
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(startTime);
// Current Time
java.util.Date currentTime = new SimpleDateFormat("HH:mm:ss")
.parse(argCurrentTime);
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(currentTime);
// End Time
java.util.Date endTime = new SimpleDateFormat("HH:mm:ss")
.parse(argEndTime);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endTime);
//
if (currentTime.compareTo(endTime) < 0) {
currentCalendar.add(Calendar.DATE, 1);
currentTime = currentCalendar.getTime();
}
if (startTime.compareTo(endTime) < 0) {
startCalendar.add(Calendar.DATE, 1);
startTime = startCalendar.getTime();
}
//
if (currentTime.before(startTime)) {
System.out.println(" Time is Lesser ");
valid = false;
} else {
if (currentTime.after(endTime)) {
endCalendar.add(Calendar.DATE, 1);
endTime = endCalendar.getTime();
}
System.out.println("Comparing , Start Time /n " + startTime);
System.out.println("Comparing , End Time /n " + endTime);
System.out
.println("Comparing , Current Time /n " + currentTime);
if (currentTime.before(endTime)) {
System.out.println("RESULT, Time lies b/w");
valid = true;
} else {
valid = false;
System.out.println("RESULT, Time does not lies b/w");
}
}
return valid;
} else {
throw new IllegalArgumentException(
"Not a valid time, expecting HH:MM:SS format");
}
}
Run Code Online (Sandbox Code Playgroud)
结果
Comparing , Start Time /n Thu Jan 01 23:00:00 IST 1970
Comparing , End Time /n Fri Jan 02 02:00:00 IST 1970
Comparing , Current Time /n Fri Jan 02 01:50:00 IST 1970
RESULT, Time lies b/w
Run Code Online (Sandbox Code Playgroud)
kal*_*lan 11
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR_OF_DAY); // Get hour in 24 hour format
int minute = now.get(Calendar.MINUTE);
Date date = parseDate(hour + ":" + minute);
Date dateCompareOne = parseDate("08:00");
Date dateCompareTwo = parseDate("20:00");
if (dateCompareOne.before( date ) && dateCompareTwo.after(date)) {
//your logic
}
private Date parseDate(String date) {
final String inputFormat = "HH:mm";
SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
try {
return inputParser.parse(date);
} catch (java.text.ParseException e) {
return new Date(0);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,更准确地说,如果比较当天00:00到24:00之间的时间间隔,您还需要解析当天.
Ale*_*amo 10
这里有很多答案,但我想提供一个新的答案,它与Basil Bourque 的答案相似,但有一个完整的代码示例。所以请看下面的方法:
private static void checkTime(String startTime, String endTime, String checkTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.US);
LocalTime startLocalTime = LocalTime.parse(startTime, formatter);
LocalTime endLocalTime = LocalTime.parse(endTime, formatter);
LocalTime checkLocalTime = LocalTime.parse(checkTime, formatter);
boolean isInBetween = false;
if (endLocalTime.isAfter(startLocalTime)) {
if (startLocalTime.isBefore(checkLocalTime) && endLocalTime.isAfter(checkLocalTime)) {
isInBetween = true;
}
} else if (checkLocalTime.isAfter(startLocalTime) || checkLocalTime.isBefore(endLocalTime)) {
isInBetween = true;
}
if (isInBetween) {
System.out.println("Is in between!");
} else {
System.out.println("Is not in between!");
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用以下方法调用此方法:
checkTime("20:11:13", "14:49:00", "01:00:00");
Run Code Online (Sandbox Code Playgroud)
或使用:
checkTime("20:11:13", "14:49:00", "05:00:00");
Run Code Online (Sandbox Code Playgroud)
结果将是:
Is in between!
Run Code Online (Sandbox Code Playgroud)
以下方法检查“validateTime”是否在“startTime”和“endTime”之间,同时考虑“endTime”可能是第二天。要正确使用它,请以“HH:mm”共振峰解析您的日期。
public static final boolean isBetweenValidTime(Date startTime, Date endTime, Date validateTime)
{
boolean validTimeFlag = false;
if(endTime.compareTo(startTime) <= 0)
{
if(validateTime.compareTo(endTime) < 0 || validateTime.compareTo(startTime) >= 0)
{
validTimeFlag = true;
}
}
else if(validateTime.compareTo(endTime) < 0 && validateTime.compareTo(startTime) >= 0)
{
validTimeFlag = true;
}
return validTimeFlag;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88678 次 |
| 最近记录: |