Jake Long
Jake Long

Reputation: 706

check if date() is monday? java

Is there a way to check if a java Date object is Monday? I see you can with a Calendar object, but date? I'm also using US-eastern date and time if that changes indexing of monday

Upvotes: 16

Views: 26782

Answers (5)

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79005

java.time

The java.util Date-Time API and their formatting API, SimpleDateFormat are outdated and error-prone. It is recommended to stop using them completely and switch to the modern Date-Time API*.

Also, quoted below is a notice from the home page of Joda-Time:

Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

Solution using java.time, the modern Date-Time API:

Use Instant to represent a moment:

Instant instant = Instant.now();
System.out.println(instant); // A sample output: 2021-07-03T09:07:37.984Z

An Instant represents an instantaneous point on the timeline in UTC. The Z in the output is the timezone designator for a zero-timezone offset. It stands for Zulu and specifies the Etc/UTC timezone (which has the timezone offset of +00:00 hours).

However, if you have got an object of java.util.Date, convert it to Instant e.g.

Date date = new Date(); // A sample date
Instant instant = date.toInstant();

Convert Instant to ZonedDateTime representing Date-Time in your timezone e.g.

ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));

Check if the Date-Time falls on Monday e.g.

System.out.println(zdt.getDayOfWeek() == DayOfWeek.SUNDAY);

Demo:

import static java.time.DayOfWeek.SUNDAY;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.now();

        ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));

        System.out.println(zdt.getDayOfWeek() == SUNDAY);
    }
}

Output:

false

ONLINE DEMO

Learn more about the modern Date-Time API from Trail: Date Time.


* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.

Upvotes: 2

Dan D.
Dan D.

Reputation: 32391

Something like this will work:

Calendar cal = Calendar.getInstance();
cal.setTime(theDate);
boolean monday = cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY;

Upvotes: 34

March
March

Reputation: 99

You should use Calendar object for these checks. Date has weak timezones support. In one timezone this Date can be Monday, and in another timezone it is still Sunday.

Upvotes: 3

Jon Skeet
Jon Skeet

Reputation: 1499880

The question doesn't make sense without two extra pieces of information: a time zone and a calendar system.

A Date object just represents an instant in time. It happens to be Wednesday in the Gregorian calendar in my time zone - but for some folks to the east of me, it's already Thursday. In other calendar systems, there may not even be such a concept of "Monday" etc.

The calendar system part is probably not a problem, but you will need to work out which time zone you're interested in.

You can then create a Calendar object and set both the time zone and the instant represented - or, better, you could use Joda Time which is a much better date/time API. You'll still need to think about the same questions, but your code will be clearer.

Upvotes: 5

kosa
kosa

Reputation: 66637

You can use Calendar object.

Set your date to calendar object using setTime(date)

Example:

calObj.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY

EDIT: As Jon Skeet suggested, you need to set TimeZone to Calendar object to make sure it works perfect for the timezone.

Upvotes: 11

Related Questions