无法比较时间范围

Fail to compare time ranges

我有两个 String 变量:

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

上面的代码会输出4321:19:4622: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(DateCalendarSimpleDateFormat)有 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");
}