Javaの日付から年、月、日などを取得して、Javaのグレゴリオ暦の日付と比較したい。これは可能ですか?


231

Javaの日付型として保存されているJavaの日付オブジェクトがあります。

グレゴリオ暦の作成日も持っています。グレゴリオ暦の日付にはパラメーターがないため、今日の日付(および時刻?)のインスタンスです。

Javaの日付を使用して、Javaの日付タイプから年、月、日、時、分、秒を取得し、グレゴリオ暦の日付を比較できるようにしたいと思います。

現時点では、Javaの日付が長い形式で保存されており、利用できるメソッドは、フォーマットされた日付文字列として長い形式を書き込むだけのようです。年、月、日などにアクセスする方法はありますか?

私はそれを見てgetYear()getMonth()ため、などの方法Dateクラスは廃止されました。私はGregorianCalendar日付で持っているJava Dateインスタンスを使用するためのベストプラクティスは何だろうと思っていました。

私の最終目標は、Javaの日付が今日の日時から数時間、数分など以内であることを確認できるように日付計算を行うことです。

私はまだJavaの初心者で、これに少し戸惑っています。


1
使用しているものは何でも使用しないでくださいDate.getYear()。問題があります(わかりません)。Date.getYear()私の日付を2017年6月30日に解析すると、それは私の年を117として返しました。それが2000年前に着陸した場所を参照してください。しかし、単に日付オブジェクトを印刷すると、出力は問題ありませんでしたDate.getYear();
Seenivasan 2017年

参考:あなたは、最近のjava.timeクラスに取って代わった、古いレガシーである厄介な古い日時クラスを使用しています。
バジルブルク

回答:


545

次のようなものを使用してください:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

注意してください、月は1ではなく0から始まります。

編集:Java 8以降、java.util.Calendarではなくjava.time.LocalDateを使用することをお勧めします。それを行う方法については、この回答を参照してください。


4
を使用cal.add(Calendar.DAY_OF_MONTH, -48)して、Calendarオブジェクトの日算術を実行できます。また、を使用して2つのCalendarオブジェクトを比較できますcal.compareTo(anotherCal)
Florent Guillaume、

1
華麗です、フロラン!上記は、カレンダーのgetメソッドが使用されると、カレンダーが更新された年と日、秒、分、秒を返すことを意味しますか?Dave
daveb

11
月は1ではなく0で始まることに注意してください(つまり、January = 0)。docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
なぜJAVAはとても不便なのですか?
キムチマン

3
日付とカレンダーは古くてデザインが悪いからです。Java 8には、はるかに優れたデータ/時間オブジェクトがあります。oracle.com
Florent Guillaume

88

Java 8以降では、DateオブジェクトをLocalDateオブジェクトに変換して、年、月、日を簡単に取得できます。

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

getMonthValue()1から12までのint値を返すことに注意してください。


10
今2016年ですが、私が使用して信じLocalDateたJava 8には、別の解決策は、使用してあなたの時間を節約する最善の解決策であるCalendarDateのトラブルがいっぱいです。
AnnieFromTaiwan 2016

2
正解です。java.timeを使用し、面倒な古い日時クラスを回避するのが最善です。また、この回答がタイムゾーンの問題にどのようにうまく対処しているかにも注目してください。特定の瞬間において、日付は世界中でタイムゾーンによって異なります。
バジルブルク16/07/13

1
残念ながら、Android向けのAPIレベル26+。
Wiktor Kalinowski、

14

あなたはこのようなことをすることができます、それはDateクラスがどのように機能するかを説明します。

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

こんにちはJavaCity、ありがとうございます。これは非常に便利です。現在、日付文字列からの解析を避けようとしています。この解析は後で行う必要がありますが、アプリケーションのユーザーに年、日、月を設定するときに行います。SimpleDateFormatに解析する文字列を作成しました。上記は、この動作を確認するのに非常に役立ちます。Javaの日付は、1日前のインスタンス化からの日付と時刻として作成されました。現在、インスタンス化されているグレゴリオ暦の日付と比較したいと思います。心からの感謝
daveb

8
コードを修正してください...小文字mmは分を示し、大文字MMは月を示します。
ヨーヨー、2016年

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

編集:date= の出力Fri Jun 15 09:20:21 CEST 2018は次のとおりです。

DAY FRIDAY
MONTH JUNE
YEAR 2018

少なくとも出力を入れていれば、コードを実行しなくても、これが役立つかどうかを人々が判断できます。
SantiBailors 2018年

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
Stack Overflowの回答には、コードスニペットだけでなく、いくつかの議論と説明が必要です。そして、あなたのコードは間違いなくいくつかの説明を使用することができます。
バジルブルク2018

1
以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク2018

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2(カレンダーソリューション)は10倍高速です。これでyyyy MM dd 00 00 00になり、date.compareを使用して比較します


2

簡単かもしれません

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

1ではなく0から開始するように注意してマウントしてください。また、カレンダーはamのようにpmを使用するため、時間と分を使用するときは非常に注意してください。

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
ここに示されているこれらの厄介な古いレガシークラスに取って代わる最新のjava.timeを使用する方が良いでしょう。正解を
バジルブルク2017

回答と提案をありがとうございます。とても良いです。
harun ugur 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.