如何在计划者中按日期对新约会进行编码

时间:2019-06-18 18:05:04

标签: java

我的任务是用Java创建约会计划程序。我已经完成了所有工作,但我无法按日期对新约会的日期进行排序。

我尝试过更改顺序,但是无论如何我都无法按日期正确排序新约会。

{"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
       int ind1 = 0,ind2 = 0;
       for(int i=0;i<12;i++) {
           if(monthArray[i].equalsIgnoreCase(month)) {
               ind1=i;
           }
           if(monthArray[i].equalsIgnoreCase(app.getMonth())) {
               ind2=i;
           }
       }
       if(ind1<ind2) {
           return 1;
       }
       else if(ind1==ind2) {
           if(this.day<app.getDay()) {
               return 1;
           }
           else if(this.getDay()>app.getDay()) {
               return -1;
           }
           else {
               if(this.getHour()<app.getHour()) {
                   return 1;
               }
               else if(this.getHour()>app.getHour()) {
                   return -1;
               }
               else {
                   if(this.getMin()<app.getMin()) {
                       return 1;
                   }
                   else if(this.getMin()>app.getMin()) {
                       return -1;
                   }
                   else {
                       return 0;
                   }
               }
           }
       }
       else {
           return -1;
       }
     }
}

我希望新约会按日期排序,但不会。

3 个答案:

答案 0 :(得分:1)

时区

一个适当的任命系统必须考虑到以下事实:世界各地的政客都倾向于重新定义其管辖下的时区。他们经常这样做,而且很少或没有警告。

因此您的Appointment类应包含两个成员字段:

  • LocalDateTime保存日期和时间。请注意,这不是 not 代表时刻,还是 not 在时间轴上的一点。如果它在明年1月23日的下午3点保持不变,我们不知道这是否意味着在东京,加尔各答,巴黎或蒙特利尔的下午3点-所有不同的时刻,相隔几个小时。
  • ZoneId表示我们打算在下午3点进行约会的时区。

示例:

LocalDate ld = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 15 , 0 ) ;
this.localDateTime = LocalDateTime.of( ld , lt ) ;
this.zoneId = ZoneId.of( "America/Los_Angeles" ) ;

排序

出于排序目的,您的类可以使用所需的Comparable方法来实现compareTo接口。

诀窍是,例如,您希望在美国东海岸的下午3点约会排在几个小时后发生的西海岸的下午3点约会之上。

因此compareTo方法必须动态计算时刻,确定时间轴上的特定点。然后,比较各种Appointment对象的矩以进行正确排序。

第一步是确保您的JVM已更新有关时区的最新规则。请记住,如上所述,这些更改经常发生。对Java的更新通常会包括对“ tzdata”区域信息的更新。如果您关心的时区最近才更改,则可能需要自己更新 tzdata

下一步是将区域动态应用于日期时间以确定时刻。将ZoneId应用于LocalDateTime以得到ZonedDateTime

ZonedDateTime zdt = this.localDateTime.atZone( this.zoneId ) ;

将其调整为UTC。根据定义,始终以UTC提取Instant对象。

Instant thisInstant = zdt.toInstant() ;

将此Instant对象的Appointment与传递给您的compareTo的另一个对象进行比较。我们可以依次调用Instant::compareTo方法来进行实际比较。

return thisInstant.compareTo( other.localDateTime.atZone( other.zoneId ).toInstant() ) ;

或者,您可以选择使用Objects.compare

答案 1 :(得分:0)

Java有一个DateTime库,该库可能会非常有帮助,但是我假设您不希望在手动执行该操作时看到该视图。

https://dzone.com/articles/java-comparable-interface-in-five-minutes

我建议您阅读类似的内容,从而提供有关可比产品的一些信息。这样,您就可以创建一个正在做的方法,将两个对象相互比较。然后,您可以使用许多标准解决方案,例如Collections.sort,以便更轻松地测试和使用代码。

我不确定那是否就是你已经在做的,所以我想我会把它扔在那里。

但是对于实际问题,最好的解决方案是使用内置函数足够有趣。

Integer.compareTo(int a, int b)将为您比较两个整数。您要做的就是反复比较整数。您可以像这样运行代码

int comp = Integer.compare(monthA, monthB;
if(comp != 0) return comp;
//proceed with rest of comparisons the same way you did the months

答案 2 :(得分:0)

如果您要获取约会日期,那为什么不直接比较而不是比较月份,日期和时间呢?

尽管您可以简单地将约会日期转换为有效日期对象,如下所示。

String sDate1="31/12/1998";  
Date date1=new SimpleDateFormat("dd/MM/yyyy").parse(sDate1);  
System.out.println(sDate1+"\t"+date1);  

参考链接:https://www.javatpoint.com/java-string-to-date

然后只需比较日期对象

    if (date1.compareTo(date2) > 0) {
        some opertaion...
    }

参考链接:https://www.mkyong.com/java/how-to-compare-dates-in-java/

希望这会对您有所帮助。