我有两个String
个变量:
time22
将存储Linux命令生成的时间timeInTheList
将存储ArrayList
time22
将获得最新时间timeInTheList
将存储以前的时间。
我想比较这两次是否已经过了30分钟,但我无法实现。
我发现一些奇怪的数据打印出日期,时间和年份,我只需要时间,我不需要任何日期或年份。
代码:
for(int x = 1;x<list1.size();x+=3)
{
try{
System.out.println("The time grab by linux command :"+time22);
String timeInTheList = list1.get(x);
System.out.println("The time in the balcklist.txt :" +timeInTheList);
SimpleDateFormat dateFormat1 = new SimpleDateFormat("HH:MM:SS");
Date Ftime1 = dateFormat1.parse(timeInTheList);
Date Stime2 = dateFormat1.parse(time22);
System.out.println("The Ftime1 value is :" +Ftime1);
System.out.println("The Stime2 value is :" +Stime2);
long diff1 = Stime2.getTime() - Ftime1.getTime();
System.out.println(Stime2.getTime());
System.out.println(Ftime1.getTime());
System.out.println("Difference between two time is :"+diff1);
if(diff1 > 1800)
{
System.out.println("it is more than 30 minute in the list");
String DeletedRule = list1.get(x+1).toString();
FinalDeletion(DeletedRule);
}
else
{
System.out.println("Keep in the list first,still not reach 30 minute");
}
}
catch(ParseException e)
{
e.printStackTrace();
}
}
这是我程序的输出:
Time from linux command(In TimeIsNow Method) :22:02:50
The time grab by linux command :22:02:50
The time in the balcklist.txt :21:19:46
The Ftime1 value is :Thu Jul 01 21:00:00 MYT 1971
The Stime2 value is :Sun Feb 01 22:00:00 MYT 1970
2730600050
47223000046
Difference between two time is :-44492399996
Keep in the list first,still not reach 30 minute
答案 0 :(得分:2)
如果您使用的是Java 8,则可以使用新日期/时间API 。 请尝试以下代码:
// Required imports
import java.time.LocalTime;
import java.time.Duration;
// Taken hard-coded values for testing purpose
String time22 = "22:02:50", timeInTheList = "21:19:46";
LocalTime Stime2 = LocalTime.parse(time22);
LocalTime Ftime1 = LocalTime.parse(timeInTheList);
System.out.println("Stime2: " + Stime2);
System.out.println("Ftime1: " + Ftime1);
Duration duration = Duration.between(Ftime1, Stime2);
long diff1 = duration.getSeconds();
System.out.println("duration: " + diff1);
if(diff1 > 1800){
System.out.println("it is more than 30 minute in the list");
/**
* Your remaining code goes here.
*/
}else{
System.out.println("Keep in the list first, still not reach 30 minute");
}
答案 1 :(得分:1)
在Joda-Time中,您可以使用DateTimeFormatter
来解析输入String
并创建LocalTime
个对象 - LocalTime
似乎是最佳选择,因为您'只处理时间(小时/分钟/秒)并且不需要知道日期(日/月/年)。
拥有LocalTime
个对象,您可以使用Minutes
类来获取它们之间的分钟数:
import org.joda.time.LocalTime;
import org.joda.time.Minutes;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
String time22 = "22:02:50";
String timeInTheList = "21:19:46";
// create formatter with format hour:minute:second
DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm:ss");
// parse Strings
LocalTime sTime2 = fmt.parseLocalTime(time22);
LocalTime fTime1 = fmt.parseLocalTime(timeInTheList);
// get the minutes between them
int minutes = Minutes.minutesBetween(fTime1, sTime2).getMinutes();
System.out.println(minutes); // 43
上面的代码会输出43
(21:19:46
和22:02:50
之间的分钟数。)
由于输入位于standard ISO-8601 format(HH:mm:ss
),您还可以在没有格式化程序的情况下解析它们:
LocalTime sTime2 = LocalTime.parse(time22);
LocalTime fTime1 = LocalTime.parse(timeInTheList);
Joda-Time正在停止并被新的API取代,因此我不建议使用joda启动新项目。即使在joda's website中它也说:“请注意,Joda-Time被认为是一个很大程度上”完成“的项目。没有计划大的增强。如果使用Java SE 8,请迁移到java.time(JSR) -310)。“即可。
因此,如果您在Joda-Time中没有庞大的代码库(这需要大量的工作来迁移),或者如果您想使用新的API,请检查下面的使用方法。
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems,并且它们将被新API替换。
如果您使用的是 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs。
如果您使用的是 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,有ThreeTenABP(更多关于如何使用它here)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中为java.time
,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp
),但类和方法名称是相同的
代码与Joda的代码非常相似:
// if you're using ThreeTen Backport, replace java.time by org.threeten.bp
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
String time22 = "22:02:50";
String timeInTheList = "21:19:46";
// parse Strings
LocalTime sTime2 = LocalTime.parse(time22);
LocalTime fTime1 = LocalTime.parse(timeInTheList);
// get the minutes between them
long minutes = ChronoUnit.MINUTES.between(fTime1, sTime2);
System.out.println(minutes); // 43
输出相同(43分钟)。
备注:强>
在原始代码中,有两个问题:
MM
是月份,SS
是秒的一小部分(查看SimpleDateFormat
javadoc了解更多详情)。这就是为什么你在解析时会得到意想不到的结果:
22:02:50
时,它需要02
作为月份(因此它变为二月)。所有缺少的字段都设置为默认值(日是1,年是1970,分钟是0,依此类推)21:19:46
时,需要19
作为月份。因此解析器采用年份(1970)的默认值并从中获取19 th 月(考虑到1970年1月是第一个月,19 th 月是1971年7月)getTime()
方法返回自January 1, 1970, 00:00:00 GMT
以来的毫秒数,因此您将获得以毫秒为单位的差异(您需要将其转换为分钟数。)无论如何,使用Joda-Time(或新的日期/时间API)会使事情变得更容易,我不建议使用旧的SimpleDateFormat
类。