Core Java

Finding Years Starting Sunday And Year Range

Determining which years start on a specific day, such as Sunday, can be an interesting challenge, often required in scheduling, planning applications, or just for curiosity. Let us delve into understanding the process of determining all years starting on a Sunday within a given year range.

1. Introduction

1.1 Java Date and Calendar Classes

The Date class in Java, part of the java.util package, represents a specific instant in time, with millisecond precision. It provides methods to manipulate dates, such as getting the current date, comparing dates, and formatting them. However, the Date class has been largely supplanted by the Calendar class due to its limitations in handling time zones and its mutable nature. The Calendar class is an abstract class that extends Object and implements the Comparable interface. It provides methods to convert between a specific instant in time and a set of calendar fields like YEAR, MONTH, DAY_OF_MONTH, HOUR, etc. The most commonly used method is getInstance(), which returns a Calendar object initialized with the current date and time in the default time zone.

1.1.1 Key Features of Calendar Class

  • Field Manipulation: You can set or get calendar fields using methods like set(int field, int value) and get(int field).
  • Date Calculations: The class allows for date arithmetic through methods such as add(int field, int amount) to add or subtract values from specific fields.
  • Time Zone Support: You can create a calendar instance for a specific time zone using getInstance(TimeZone zone).
  • Lenient Mode: The calendar can operate in lenient mode, accepting a wider range of values for fields, which can be useful for certain applications.

1.2 Java Time API

Introduced in Java 8 as part of the java.time package, the Java Time API addresses many shortcomings of the older Date and Calendar classes. It is inspired by Joda-Time and offers a more comprehensive and user-friendly way to handle dates and times.

1.2.1 Key Components

  • LocalDate: Represents a date without time-zone information (e.g., 2023-01-08).
  • LocalTime: Represents a time without date information (e.g., 10:15:30).
  • LocalDateTime: Combines both date and time without timezone (e.g., 2023-01-08T10:15:30).
  • ZonedDateTime: Represents a date-time with timezone information (e.g., 2023-01-08T10:15:30+01:00[Europe/Paris]).

1.2.2 Advantages of Java Time API

  • Immutability: The classes are immutable, which makes them thread-safe.
  • Fluent API Design: Methods return new instances rather than modifying existing ones.
  • Better Time Zone Handling: Provides comprehensive support for different time zones.

2. Java Date and Calendar Classes Solution

Prior to Java 8, the Date and Calendar classes were the primary tools for handling date and time. Although not as intuitive as modern date APIs, they can still be used to determine if a given year starts on a Sunday. Here’s a solution using these classes.

// Import necessary classes

import java.util.Calendar;
import java.util.GregorianCalendar;

public class SundayYearsUsingCalendar {
  public static void main(String[] args) {
    int startYear = 2000;

    int endYear = 2025;

    for (int year = startYear; year < = endYear; year++) {
      Calendar calendar = new GregorianCalendar(year, Calendar.JANUARY, 1);

      if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
        System.out.println(year + " starts on a Sunday.");
      }
    }
  }
}

This code iterates through each year in the specified range, creating a GregorianCalendar instance for January 1st of each year. It then checks if the first day of the year is a Sunday by comparing the day of the week. The code gives the following output on the IDE console.

2006 starts on a Sunday.
2012 starts on a Sunday.
2017 starts on a Sunday.
2023 starts on a Sunday.

3. Java Time API Solution

With the introduction of Java 8, the java.time API provides a more robust and flexible approach to date and time handling. The java.time.LocalDate class allows us to specify a date directly and makes checking for a specific day of the week straightforward.

// Import necessary classes

import java.time.DayOfWeek;
import java.time.LocalDate;

public class SundayYearsUsingJavaTime {
  public static void main(String[] args) {
    int startYear = 2000;

    int endYear = 2025;

    for (int year = startYear; year < = endYear; year++) {
      LocalDate date = LocalDate.of(year, 1, 1);

      if (date.getDayOfWeek() == DayOfWeek.SUNDAY) {
        System.out.println(year + " starts on a Sunday.");
      }
    }
  }
}

In this example, we use LocalDate.of() to create a date for January 1st of each year and then check if it is a Sunday by comparing the day of the week. The java.time API is more readable and less error-prone compared to the traditional Calendar approach. The code gives the following output on the IDE console.

2006 starts on a Sunday.
2012 starts on a Sunday.
2017 starts on a Sunday.
2023 starts on a Sunday.

4. Java 8 Streams

Java 8 introduced Streams, enabling a functional style of programming. With Streams, we can iterate through a range of years and filter out those that start on a Sunday.

// Import necessary classes

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.stream.IntStream;

public class SundayYearsUsingStreams {
  public static void main(String[] args) {
    int startYear = 2000;

    int endYear = 2025;

    IntStream
        .rangeClosed(startYear, endYear)
        .filter(
            year -> LocalDate.of(year, 1, 1).getDayOfWeek() == DayOfWeek.SUNDAY)
        .forEach(year -> System.out.println(year + " starts on a Sunday."));
  }
}

Here, we use IntStream.rangeClosed() to create a stream of years within the range. The filter method checks if January 1st of each year is a Sunday, and forEach prints the years that meet the criteria. This approach is concise and leverages functional programming in Java 8. The code gives the following output on the IDE console.

2006 starts on a Sunday.
2012 starts on a Sunday.
2017 starts on a Sunday.
2023 starts on a Sunday.

5. Conclusion

In this article, we explored multiple methods to find all years that start on a Sunday within a specified range. The traditional Date and Calendar classes provide a functional, if somewhat outdated, solution. The java.time API, introduced in Java 8, offers a more elegant and easy-to-use approach. Finally, Java 8 Streams provide a functional programming alternative that is both concise and expressive. Depending on your project requirements, each of these methods has its use cases, with java.time generally being the most recommended for modern applications.

Yatin Batra

An experience full-stack engineer well versed with Core Java, Spring/Springboot, MVC, Security, AOP, Frontend (Angular & React), and cloud technologies (such as AWS, GCP, Jenkins, Docker, K8).
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button