1

我想知道有没有办法检查 Java 日期格式,以确保用户不会输入格式为 dd-MM-yyyy 的日期,例如 56-13-2013。目前,当我输入一个 13 个月的日期时,它将结转增加一年,然后显示 1 个月。例如 16-16-2013 会给我 16-04-2014。

4

3 回答 3

4

用于setLenient验证输入Date String

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
format.setLenient(false);
Date date = format.parse(myDateString);
于 2013-06-04T15:07:09.287 回答
1

你还没有说你当前是如何解析这个值的——我假设它是 with SimpleDateFormat。只需调用setLenient(false)即可验证输入。

例如:

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        // Prints a value in 2014
        System.out.println(format.parse("16-16-2013"));
        format.setLenient(false);
        // Throws an exception
        System.out.println(format.parse("16-16-2013"));        
    }
}

如果您正在做大量工作,我还强烈建议您使用Joda Time而不是内置类。

于 2013-06-04T15:07:02.607 回答
1

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

另外,下面引用的是来自Joda-Time主页的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用java.time现代日期时间 API 的解决方案:

这可以通过使用ResolverStyle提供三种不同方法(严格、智能和宽松)的适当方法来控制。智能选项是默认的,只要它在 1-31 范围内就可以解析日期,只要在 1-12 范围内就可以解析月份。

演示:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        demonstrateResolverStyles("56-13-2013");
        demonstrateResolverStyles("29-02-2013");
        demonstrateResolverStyles("32-02-2013");
        demonstrateResolverStyles("28-13-2013");
    }

    static void demonstrateResolverStyles(String input) {
        System.out.println("Input string: " + input);
        try {
            System.out.println("Parsed using ResolverStyle.LENIENT => " + LocalDate.parse(input,
                    DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH).withResolverStyle(ResolverStyle.LENIENT)));
        } catch (DateTimeParseException e) {
            System.out.println(e.getMessage());
        }

        try {
            // Default is ResolverStyle.SMART
            System.out.println("Parsed using ResolverStyle.SMART => "
                    + LocalDate.parse(input, DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH)));
        } catch (DateTimeParseException e) {
            System.out.println(e.getMessage());
        }

        try {
            System.out.println("Parsed using ResolverStyle.STRICT => " + LocalDate.parse(input,
                    DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH).withResolverStyle(ResolverStyle.STRICT)));
        } catch (DateTimeParseException e) {
            System.out.println(e.getMessage());
        }
        System.out.println();
    }
}

输出:

Input string: 56-13-2013
Parsed using ResolverStyle.LENIENT => 2014-02-25
Text '56-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
Text '56-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13

Input string: 29-02-2013
Parsed using ResolverStyle.LENIENT => 2013-03-01
Parsed using ResolverStyle.SMART => 2013-02-28
Text '29-02-2013' could not be parsed: Invalid date 'February 29' as '2013' is not a leap year

Input string: 32-02-2013
Parsed using ResolverStyle.LENIENT => 2013-03-04
Text '32-02-2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
Text '32-02-2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32

Input string: 28-13-2013
Parsed using ResolverStyle.LENIENT => 2014-01-28
Text '28-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
Text '28-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13

ONLINE DEMO

从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-07-08T18:40:15.163 回答