【问题标题】:Check if a string is a valid date [duplicate]检查字符串是否是有效日期[重复]
【发布时间】:2018-06-18 19:59:25
【问题描述】:

我想在构造函数中放入一个日期类型的参数,所以我认为最好的方法是编写一个将字符串转换为日期的方法。检查我的字符串是否是有效日期的最简单方法是什么?

这是我的构造函数:

Product product = new Product("Produs 1", 312.33, updateDate("23/12/2018"));

这是将字符串转换为日期的方法。

public static Date updateDate(String date) {
    Date newDate = new Date();
    try {
        DateFormat dtF = new SimpleDateFormat("dd/MM/yyyy");
        newDate = dtF.parse(date);
        return newDate;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return newDate;
}

【问题讨论】:

  • 你可以这样解析,但是当它无效时不要返回当前日期:抛出一个异常,或者返回一个Optional。否则,你怎么区分“你给了我一个无效的日期”和“你给了我当前的日期”?
  • 如果您预期的日期无效,请考虑返回 Optional<Date>。此外,updateDate() 是一个日期解析方法的混淆名称。
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 的表现要好得多。

标签: java validation date date-parsing


【解决方案1】:

我会让 try-catch 块尽可能小。另外,如果解析字符串时出现问题,我会返回 Optional<Date> 而不是新创建的 date 对象。

public static Optional<Date> getDateFromString(String s) {
    Date date = null;
    DateFormat dtF = new SimpleDateFormat("dd/MM/yyyy");
    try {
        date = dtF.parse(s);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return Optional.ofNullable(date);
}

一个好的做法是使用更具自我描述性的名称来命名函数,例如getDateFromString

【讨论】:

  • 这并不向调用者表明它失败了,因为可选仍然有一个值。
  • 您好,感谢您的回答!如果我返回 Optional.ofNullable(date);我收到错误:“错误:(23、35)java:不兼容的类型:不存在类型变量 T 的实例,因此 java.util.Optional 符合 java.util.Date”
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle
  • 该方法签名不应该说Optional&lt; Date &gt;而不是Date吗?
  • 这段代码有多个bug。
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2016-09-16
  • 2012-09-15
  • 2020-06-23
相关资源
最近更新 更多