Geoffrey Sterkel
Geoffrey Sterkel

Reputation: 1

How to code new appointments in a planner to be arranged by date

I was tasked with creating an appointment planner in Java. I have everything done except I am having trouble with making the dates of new appointments be sorted by date.

I have tried switching the order around but no matter what I cannot get new appointments to be sorted properly by date.

{"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;
       }
     }
}

I expect new appointments to be sorted by date but they are not.

Upvotes: 0

Views: 120

Answers (3)

Basil Bourque
Basil Bourque

Reputation: 339669

Time Zone

A proper appointment system must account for the fact that politicians around the world have shown a proclivity for redefining the time zone(s) under their juridiction. They do so surprisingly often, and with little or no warning.

So your Appointment class should carry two member fields:

  • LocalDateTime to hold the date and the time of day. Note that this does not represent a moment, is not a point on the timeline. If it holds a value of 3 PM on January 23rd next year, we don’t know if that means 3 PM in Tokyo, Kolkata, Paris, or Montreal — all different moments, several hours apart.
  • ZoneId for the time zone in which we intend that 3 PM appointment.

Example:

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" ) ;

Sorting

For sorting purposes, your class can implement the Comparable interface, with the required compareTo method.

The trick is that you want the 3 PM appointments on the east coast of the US, for example, to sort above the 3 PM appointments of the west coast which occur a few hours later.

So the compareTo method must dynamically calculate a moment, determine a specific point on the timeline. Then, compare the moments of the various Appointment objects to sort properly.

First step is being sure that your JVM has been updated with the latest rules about the time zones. Remember, as mentioned above, these change quite often. Updates to Java will often include an update to the “tzdata” zone information. If a time zone you care about has changed more recently, you may need to update the tzdata yourself.

Next step is dynamically applying the zone to the date-time to determine a moment. Apply the ZoneId to the LocalDateTime to get a ZonedDateTime.

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

Adjust that to UTC. Extract a Instant object, always in UTC by definition.

Instant thisInstant = zdt.toInstant() ;

Compare the Instant of this Appointment object with the other one passed to your compareTo. We can, in turn, call the Instant::compareTo method to do the work of actually comparing.

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

Alternatively, you might choose to use Objects.compare.

Upvotes: 1

Mak
Mak

Reputation: 1078

If you are getting appointment date then why dont you directing comparing them instead of comparing month ,date and time.

Though you can simply convert your appointment date to valid date object as below.

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

Reference link : https://www.javatpoint.com/java-string-to-date

Then simply compare date object

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

Reference link : https://www.mkyong.com/java/how-to-compare-dates-in-java/

Hope this will help you.

Upvotes: 0

Matthew Kerian
Matthew Kerian

Reputation: 812

Java has a DateTime library that could be very helpful, but I'm assuming you don't want that seeing as you're doing it manually.

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

I'd recommend reading something like that, which gives a little bit of information about comparables. This allows you to create a method doing what you're doing, comparing two objects to each other. Then you can use a lot of standard solutions such as Collections.sort in order to test out and use your code more easily.

I'm not sure if that's what you're already doing so i thought I'd throw it out there.

But for the actual problem, the best solution is funnily enough using an inbuilt function.

Integer.compareTo(int a, int b) will compare two integers for you. All you're doing is repeatedly comparing integers. You can run your code like

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

Upvotes: 0

Related Questions