2

I want to get day names between two dates with simple Java, without using any third party library.

I want to get names like Saturday, Sunday, Monday between two days inclusive both.

AZ_
  • 21,688
  • 25
  • 143
  • 191

2 Answers2

2
/**
     * 
     * @param startDate
     * @param endDate
     * @return Start Date and End Date are <b>Inclusive</b>, days returned between these two dates
     */
    protected List<String> getWeekDayNames(Date startDate, Date endDate) {
        List<String> days = new ArrayList<String>();

        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);

        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);

        if (startCal.getTimeInMillis() == endCal.getTimeInMillis()) {

            days.add(this.formatDayOfWeek(startCal.getTime()));

            return Collections.unmodifiableList(days);
        }
        // swap values
        if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) {
            startCal.setTime(endDate);
            endCal.setTime(startDate);
        }

        do {

            days.add(this.formatDayOfWeek(startCal.getTime()));

            startCal.add(Calendar.DAY_OF_MONTH, 1);

        } while (startCal.getTimeInMillis() <= endCal.getTimeInMillis());

        return Collections.unmodifiableList(days);
    }

Usage:

Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, 15);

        List<String> list = new Test().getWeekDayNames(new Date(), cal.getTime());

        System.out.println(list);

Output:

[SATURDAY, SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
AZ_
  • 21,688
  • 25
  • 143
  • 191
1

Joda-Time

Usually I would suggest the Joda-Time library, a popular replacement for the notoriously troublesome java.util.Date & java.util.Calendar classes bundled with Java. But the Question requires no third-party libraries.

java.time.*

So, instead of Joda-Time, my code example below uses the new java.time.* package bundled with Java 8. These classes are inspired by Joda-Time, but are entirely re-architected. They are defined by JSR 310. For more information, see the new Tutorial from Oracle.

The solution is quite simple. Boils down to this one-line fragment…

DayOfWeek.from( zonedDateTime ).getDisplayName( TextStyle.FULL, Locale.US );

For fun, I tossed in an extra line to show how easy it is to localize. In this case I show the French as well as US English word for day-of-week.

Here is the entire snippet, ready to run if you import java.time.* and java.time.format.*.

ZoneId timeZone = ZoneId.of( "America/New_York" );

ZonedDateTime start = ZonedDateTime.now( timeZone );
ZonedDateTime stop = start.plusDays( 2 );

// Usually spans of time are handled in a "half-open" manner, meaning start is inclusive and stop is exclusive.
// But the Question required both start and stop to be inclusive. So add "1".
long days = java.time.temporal.ChronoUnit.DAYS.between( start, stop ) + 1L;

System.out.println( days + " days from " + start + " to " + stop + " inclusive…");
for ( int i = 0; i < days; i++ ) {
    ZonedDateTime zonedDateTime = start.plusDays( i );
    String dayOfWeek = DayOfWeek.from( zonedDateTime ).getDisplayName( TextStyle.FULL, java.util.Locale.US );
    String dayOfWeek_Français = DayOfWeek.from( zonedDateTime ).getDisplayName( TextStyle.FULL, java.util.Locale.FRENCH );
    System.out.println( "zonedDateTime: " + zonedDateTime + "  dayOfWeek: " + dayOfWeek + "  dayOfWeek_Français: " + dayOfWeek_Français );
}

When run…

3 days from 2014-02-08T06:06:33.335-05:00[America/New_York] to 2014-02-10T06:06:33.335-05:00[America/New_York] inclusive…
zonedDateTime: 2014-02-08T06:06:33.335-05:00[America/New_York]  dayOfWeek: Saturday  dayOfWeek_Français: samedi
zonedDateTime: 2014-02-09T06:06:33.335-05:00[America/New_York]  dayOfWeek: Sunday  dayOfWeek_Français: dimanche
zonedDateTime: 2014-02-10T06:06:33.335-05:00[America/New_York]  dayOfWeek: Monday  dayOfWeek_Français: lundi
Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154