【问题标题】:Java Validating Date entryJava 验证日期条目
【发布时间】:2013-06-04 15:05:01
【问题描述】:

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

【问题讨论】:

  • 您也可以考虑使用 JDateChooser。更干净,更不容易出错。

标签: java date format error-checking


【解决方案1】:

使用setLenient 验证输入Date String

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
format.setLenient(false);
Date date = format.parse(myDateString);

【讨论】:

  • 谢谢我没有
【解决方案2】:

你还没有说你当前是如何解析这个值的——我假设它是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 而不是内置类。

【讨论】:

    【解决方案3】:

    java.time

    java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

    另外,下面引用的是来自home page of Joda-Time的通知:

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

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

    这可以通过使用适当的ResolverStyle 来控制,该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 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多