调试与日历日期 GMT 相关的简单 java 代码

发布于 2024-11-05 21:22:29 字数 1110 浏览 5 评论 0原文

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

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

我做错了什么?

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;
    }
}

This test shows

dateFromNet.after(IEndTime) == true

i.e. 11-03-2004 is after 20-05-2004

What have I done wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遮云壑 2024-11-12 21:22:29
Calendar IEndTime = strToCal("20-05-2004", "dd-mm-yyyy");

mm 代表毫秒;使这些国会大厦为 M,如下所示:

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

mm is for milliseconds; make those capitol M, like this:

Calendar IEndTime = strToCal("20-05-2004", "dd-MM-yyyy");
清醇 2024-11-12 21:22:29

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

字母日期或时间组件表示示例
m小时中的分钟数字30
M一年中的月份 月份七月;七月; 07

因此,问题的根本原因是在模式 dd-mm-yyyy 中使用 m 而不是 M

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

如果您确实需要来自 ZonedDateTime 对象的 java.util.Calendar 对象,您可以按如下方式执行此操作:

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

了解有关 现代日期时间 API* 来自 跟踪:日期时间


* 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport 将大部分 java.time 功能向后移植到 Java 6 和 Java 6 7. 如果您正在处理 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请检查 通过脱糖提供 Java 8+ API如何在Android项目中使用ThreeTenABP

The letter, m and M have different meanings as shown in the following table:

LetterDate or Time ComponentPresentationExamples
mMinute in hourNumber30
MMonth in yearMonthJuly; Jul; 07

So, the root cause of the problem is using m instead of M in the pattern, dd-mm-yyyy.

java.time

The legacy date-time API (java.util date-time types and their formatting type, SimpleDateFormat) is outdated and error-prone. It is recommended to stop using it completely and switch to java.time, the modern date-time API*.

Demo of the modern 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"));
    }
}

Output:

11-MAR-2004 < 20-05-2004

If at all you need an object of java.util.Calendar from this object of ZonedDateTime, you can do so as follows:

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文