1
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Test {

    public static void main(String[] args) throws ParseException {

        Calendar dateFromNet = strToCal("11-MAR-2004", "dd-MMM-yyyy");
        Calendar IEndTime = strToCal("20-05-2004", "dd-mm-yyyy");

        if (dateFromNet.after(IEndTime) ) {

            System.out.println(dateFromNet);
            System.out.println(IEndTime);

            System.out.println("not true: 11-MAR-2004(11-3-2004) > 20-05-2004 ");
        }


    }

    private static Calendar strToCal(String date, String format) throws ParseException {
        SimpleDateFormat input = new SimpleDateFormat(format);
        input.setTimeZone(TimeZone.getTimeZone("GMT"));

        Date d = (Date) input.parse(date);
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        return c;
    }
}

このテストは

dateFromNet.after(IEndTime) == true

つまり、2004年11月3日は2004年5月20日以降です。

私は何を間違えましたか?

4

2 に答える 2

2
Calendar IEndTime = strToCal("20-05-2004", "dd-mm-yyyy");

mmはミリ秒です。次のように、これらのキャピトルMを作成します。

Calendar IEndTime = strToCal("20-05-2004", "dd-MM-yyyy");
于 2011-05-09T09:40:17.353 に答える
1

次の表に示すように、文字、mおよびの意味は異なります。M

手紙 日付または時刻コンポーネント プレゼンテーション
m 時間の分 番号 30
M 年の月 7月; 7月; 07

したがって、問題の根本的な原因は、パターンのm代わりにを使用することです。Mdd-mm-yyyy

java.time

従来の日時API(java.util日時タイプとそのフォーマットタイプSimpleDateFormat)は古く、エラーが発生しやすくなっています。java.time完全に使用を中止し、最新の日時API *に切り替えることをお勧めします。

最新のAPIのデモ:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {

        ZonedDateTime dateFromNet = strToZdt("11-MAR-2004", "d-MMM-u");
        ZonedDateTime IEndTime = strToZdt("20-05-2004", "d-M-u");

        if (dateFromNet.isAfter(IEndTime)) {
            System.out.println("11-MAR-2004 > 20-05-2004");
        } else if (dateFromNet.isBefore(IEndTime)) {
            System.out.println("11-MAR-2004 < 20-05-2004");
        } else {
            System.out.println("11-MAR-2004 = 20-05-2004");
        }
    }

    private static ZonedDateTime strToZdt(String date, String format) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .appendPattern(format)
                                .toFormatter(Locale.ENGLISH);

        LocalDate localDate = LocalDate.parse(date, dtf);

        return localDate.atStartOfDay(ZoneId.of("Etc/UTC"));
    }
}

出力:

11-MAR-2004 < 20-05-2004

java.util.Calendarのこのオブジェクトからのオブジェクトが必要な場合はZonedDateTime、次のように行うことができます。

Calendar calendar = Calendar.getInstance();
calendar.setTime(Date.from(dateFromNet.toInstant()));

最新の日時API *の詳細については、Trail :DateTimeをご覧ください。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-05-16T11:04:59.383 に答える