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

即 11-03-2004 是在 20-05-2004 之后

我做错了什么?

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

字母,mM有不同的含义,如下表所示:

日期或时间组件 介绍 例子
一小时一分钟 数字 30
一年中的月份 七月; 七月; 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()));

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-16T11:04:59.383 回答