无法比较时间范围
Fail to compare time ranges
我有两个 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
在 Joda-Time 中,您可以使用 DateTimeFormatter
来解析输入 String
并创建 LocalTime
对象 - LocalTime
似乎是最佳选择,因为你只处理时间 (hour/minute/second) 而不需要知道日期 (day/month/year).
有了 LocalTime
个对象,您可以使用 Minutes
class 来获取它们之间的分钟数:
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);
Java 新 Date/Time API
Joda-Time 将被新的 APIs 取代,因此我不建议使用 joda 开始一个新项目。即使在 joda's website 它说:"Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).".
因此,如果您在 Joda-Time 中没有庞大的代码库(迁移需要大量工作)或者如果您想使用新的 API,请查看如何在下面使用它。
旧的 classes(Date
、Calendar
和 SimpleDateFormat
)有 lots of problems,它们正在被新的 APIs.
如果您正在使用 Java 8,请考虑使用 new java.time API. It's easier, less bugged and less error-prone than the old APIs.
如果您使用 Java <= 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, there's the ThreeTenABP (more on how to use it ).
下面的代码适用于两者。
唯一的区别是包名称(在 Java 8 中是 java.time
,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp
),但是 classes 和方法 names 相同。
代码与 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) 的默认值并从中获取第 19th 个月(考虑到 1970 年 1 月是第一个月,第 19th 月份是 1971 年 7 月)
getTime()
方法 returns 自 January 1, 1970, 00:00:00 GMT
以来的毫秒数,因此您得到的毫秒差值(您需要将其转换为分钟)。
无论如何,使用 Joda-Time(或新的 Date/Time API)会让事情变得容易得多,我不建议使用旧的 SimpleDateFormat
class。
如果你正在使用Java8,你可以使用新Date/TimeAPI。
请尝试以下代码:
// 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");
}
我有两个 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
在 Joda-Time 中,您可以使用 DateTimeFormatter
来解析输入 String
并创建 LocalTime
对象 - LocalTime
似乎是最佳选择,因为你只处理时间 (hour/minute/second) 而不需要知道日期 (day/month/year).
有了 LocalTime
个对象,您可以使用 Minutes
class 来获取它们之间的分钟数:
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);
Java 新 Date/Time API
Joda-Time 将被新的 APIs 取代,因此我不建议使用 joda 开始一个新项目。即使在 joda's website 它说:"Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).".
因此,如果您在 Joda-Time 中没有庞大的代码库(迁移需要大量工作)或者如果您想使用新的 API,请查看如何在下面使用它。
旧的 classes(Date
、Calendar
和 SimpleDateFormat
)有 lots of problems,它们正在被新的 APIs.
如果您正在使用 Java 8,请考虑使用 new java.time API. It's easier, less bugged and less error-prone than the old APIs.
如果您使用 Java <= 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, there's the ThreeTenABP (more on how to use it
下面的代码适用于两者。
唯一的区别是包名称(在 Java 8 中是 java.time
,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp
),但是 classes 和方法 names 相同。
代码与 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) 的默认值并从中获取第 19th 个月(考虑到 1970 年 1 月是第一个月,第 19th 月份是 1971 年 7 月)
- 解析
getTime()
方法 returns 自January 1, 1970, 00:00:00 GMT
以来的毫秒数,因此您得到的毫秒差值(您需要将其转换为分钟)。
无论如何,使用 Joda-Time(或新的 Date/Time API)会让事情变得容易得多,我不建议使用旧的 SimpleDateFormat
class。
如果你正在使用Java8,你可以使用新Date/TimeAPI。 请尝试以下代码:
// 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");
}