无法比较时间范围

时间:2017-06-14 14:08:56

标签: java time jodatime date-comparison

我有两个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

2 个答案:

答案 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

上面的代码会输出4321:19:4622:02:50之间的分钟数。)

由于输入位于standard ISO-8601 formatHH:mm:ss),您还可以在没有格式化程序的情况下解析它们:

LocalTime sTime2 = LocalTime.parse(time22);
LocalTime fTime1 = LocalTime.parse(timeInTheList);

Java新日期/时间API

Joda-Time正在停止并被新的API取代,因此我不建议使用joda启动新项目。即使在joda's website中它也说:“请注意,Joda-Time被认为是一个很大程度上”完成“的项目。没有计划大的增强。如果使用Java SE 8,请迁移到java.time(JSR) -310)。“即可。

因此,如果您在Joda-Time中没有庞大的代码库(这需要大量的工作来迁移),或者如果您想使用新的API,请检查下面的使用方法。

旧类(DateCalendarSimpleDateFormat)有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类。