繁体   English   中英

如何比较 ISO8601 格式的日期?

[英]How to compare dates in ISO8601 format?

有没有办法将 ISO8601 日期与 Java 进行比较? 比如,要知道字符串日期是否是好的格式,要知道月份是否不是负数且不大于 12,要知道天数是否不超过 31,如果 2 月不超过 29 天,则当 %4 时...

我也在找怎么知道网上有没有class比较两个ISO8601日期? 比如,如果我有:2000-12-12 和 1999-05-06。 我如何比较这两个日期以准确区分年、月和日?

如果您使用的是 Java 8 或更新版本,请使用java.time package 中的设施:

LocalDate date1 = LocalDate.parse("1999-05-06"), 
    date2 = LocalDate.parse("2000-12-12");
Period period = Period.between(date1, date2);
// Prints "1 years, 7 months and 6 days"
System.out.printf("%d years, %d months and %d days\n", period.getYears(),
            period.getMonths(), period.getDays());

您需要的所有信息都可以从LocalDate class 中的方法中提取。 如果字符串的格式无效, LocalDate::parse方法将抛出一个异常,指示出了什么问题。

Java (8+) 中有关如何解析和比较日期的一些示例。 您可以为此使用java.time.LocalDate class。 这里的例子:

try {
    LocalDate.of(2000, 13, 12);
} catch (DateTimeException e) {
    System.out.println("It seems the date 12/13/2000 is invalid?");
}

// If you have only a string...

LocalDate.parse("2000-03-10");
System.out.println("I managed to parse the date from a string");

try {
    LocalDate.of(2000, 2, 30);
} catch (DateTimeException e) {
    System.out.println("It seems the date 30/02/2000 is invalid?");
}

var date1 = LocalDate.of(2000, 12, 12);
var date2 = LocalDate.of(1999, 5, 6);

if (date1.isBefore(date2)) {
    System.out.println("Date 1 is before date 2");
} else if (date1.isEqual(date2)) {
    System.out.println("Date 1 is equal to date 2");
} else {
    System.out.println("Date 1 is after date 2");
}

var period = Period.between(date2, date1);

System.out.println("Difference between date 1 and date 2 is: ");
System.out.print(period.getYears() + " years, ");
System.out.print(period.getMonths() + " months, ");
System.out.print(period.getDays() + " days");

这将打印:

It seems the date 12/13/2000 is invalid?
I managed to parse the date from a string
It seems the date 30/02/2000 is invalid?
Date 1 is after date 2
Difference between date 1 and date 2 is: 
1 years, 7 months, 6 days

如果您也必须处理时间,您可以使用LocalDateTime class。 如果您尝试手动操作,这两个课程将为您节省大量时间!

您还可以使用ChronoUnit class 计算以天为单位的距离,只需执行以下操作:

ChronoUnit.DAYS.between(date1, date2);
ChronoUnit.MONTHS.between(date1, date2);
ChronoUnit.YEARS.between(date1, date2);

在此处查看 ChronoUnit 方法: https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.ZFC35FDC70D5FC69D25698Z83A82CCE2

有没有办法将 ISO8601 日期与 Java 进行比较? 比如,要知道字符串日期是否是好的格式,要知道月份是否不是负数且不大于 12,要知道天数是否不超过 31,如果 2 月不超过 29 天,则当 %4 时...

在将年、月和日作为参数传递给try-catch块内的LocalDate.of时获取LocalDate实例。 如果其中任何一个无效,则将抛出DateTimeException指示相同。

演示

import java.time.DateTimeException;
import java.time.LocalDate;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year, month, dayOfMonth;
        LocalDate date;
        System.out.print("Enter the year, month and day separated by space: ");
        year = scanner.nextInt();
        month = scanner.nextInt();
        dayOfMonth = scanner.nextInt();

        try {
            date = LocalDate.of(year, month, dayOfMonth);
            System.out.println("The date in ISO 8601 format is " + date);
        } catch (DateTimeException e) {
            System.out.println(e.getMessage());
        }
    }
}

示例运行:

Enter the year, month and day separated by space: 2020 2 30
Invalid date 'FEBRUARY 30'

另一个示例运行:

Enter the year, month and day separated by space: 2020 2 29
The date in ISO 8601 format is 2020-02-29

我也在找怎么知道网上有没有class比较两个ISO8601日期? 比如,如果我有:2000-12-12 和 1999-05-06。 我如何比较这两个日期以准确区分年、月和日?

使用LocalDate#until获取java.time.Period从中可以获取年、月和日。

演示

import java.time.LocalDate;
import java.time.Period;

public class Main {
    public static void main(String[] args) {
        String dateStr1 = "1999-05-06";
        String dateStr2 = "2000-12-12";

        LocalDate date1 = LocalDate.parse(dateStr1);
        LocalDate date2 = LocalDate.parse(dateStr2);

        Period period = date1.until(date2);
        System.out.printf("There are %d years, %d months and %d days between %s and %s", period.getYears(),
                period.getMonths(), period.getDays(), dateStr1, dateStr2);
    }
}

Output:

There are 1 years, 7 months and 6 days between 1999-05-06 and 2000-12-12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM