Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为了这个目的,这是我会使用的选项。另一方面,还有其他选择: 在决定如何解析字符串之前,先尝试一下字符串 使用格式模式字符串的可选部分_Java_Date_Parsing - Fatal编程技术网

Java 为了这个目的,这是我会使用的选项。另一方面,还有其他选择: 在决定如何解析字符串之前,先尝试一下字符串 使用格式模式字符串的可选部分

Java 为了这个目的,这是我会使用的选项。另一方面,还有其他选择: 在决定如何解析字符串之前,先尝试一下字符串 使用格式模式字符串的可选部分,java,date,parsing,Java,Date,Parsing,在我的演示中,我使用了java.time,这是一种现代的java日期和时间API,因为问题中使用的date类总是设计得很糟糕,现在已经过时很久了。对于没有时间的日期,我们需要一个java.time.LocalDate 试一试 在java.time中使用try-catch如下所示: public Date parsedate(String date){ if(date !== null){ try{ 1. create a SimpleDateFormat ob

在我的演示中,我使用了java.time,这是一种现代的java日期和时间API,因为问题中使用的
date
类总是设计得很糟糕,现在已经过时很久了。对于没有时间的日期,我们需要一个
java.time.LocalDate

试一试 在java.time中使用try-catch如下所示:

public Date parsedate(String date){

   if(date !== null){
      try{
        1. create a SimpleDateFormat object using 'dd-MMM-yy' as the pattern
        2. parse the date
        3. return the parsed date
      }catch(ParseException e){
          try{
              1. create a SimpleDateFormat object using 'dd/MM/yyy' as the pattern
              2. parse the date
              3. return parsed date
           }catch(ParseException e){
              return null
           }
      }
   }else{
      return null
   }

} 
for (Date d: parseWithPatterns(someString, stream("dd/MM/yyyy", "dd-MM-yyyy")) {
  // Do something with the date here.
}
    DateTimeFormatter ddmmmuuFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ENGLISH);
    DateTimeFormatter ddmmuuuuFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    String dateString = "07-Jun-09";

    LocalDate result;
    try {
        result = LocalDate.parse(dateString, ddmmmuuFormatter);
    } catch (DateTimeParseException dtpe) {
        result = LocalDate.parse(dateString, ddmmuuuuFormatter);
    }
    System.out.println("Date: " + result);
输出为:

日期:2009-06-07

假设我们将字符串定义为:

    String dateString = "07/06/2009";
然后输出仍然是一样的

尝尝 如果您希望避免使用try-catch构造,那么很容易进行简单的检查以确定字符串符合哪种格式。例如:

import fj.F; import fj.F2;
import fj.data.Option;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static fj.Function.curry;
import static fj.Option.some;
import static fj.Option.none;
...

F<String, F<String, Option<Date>>> parseDate =
  curry(new F2<String, String, Option<Date>>() {
    public Option<Date> f(String pattern, String s) {
      try {
        return some(new SimpleDateFormat(pattern).parse(s));
      }
      catch (ParseException e) {
        return none();
      }
    }
  });
    if (dateString.contains("-")) {
        result = LocalDate.parse(dateString, ddmmmuuFormatter);
    } else {
        result = LocalDate.parse(dateString, ddmmuuuuFormatter);
    }
结果和以前一样

在格式模式字符串中使用可选部分 这是我最不喜欢的选项,但它很短,并且是为了衡量完整性而提出的

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("[dd-MMM-uu][dd/MM/uuuu]", Locale.ENGLISH);
    LocalDate result = LocalDate.parse(dateString, dateFormatter);
方括号表示格式的可选部分。因此Java首先尝试使用
dd MMM uu
进行解析。无论成功与否,它都会尝试使用
dd/MM/uuu
解析字符串的其余部分。给定两种格式,其中一种尝试将成功,并且您已经解析了日期。结果仍然与上面相同

链接
解释如何使用java.time。

在java中检查长度应该比在中搜索字符快。@van:不需要过早优化。如果您决定保留您的解决方案,然后,请仅创建2个SimpleDataFormat实例,并将它们作为常量存储在类中,而不是创建它们130K次。如果确实将它们作为常量存储,请确保它们不会同时从多个线程中使用!我在前面遇到了一些问题,并提供了一个FindBugs检测器,用于查找静态日期格式和日历。它们被记录为非线程安全的,但这很容易被忽略。瞧,@van:别这样。SimpleDateFormat不是线程安全的,因此如果你从多个线程使用该类,事情会在你面前爆发。我想我会听取大家的建议,继续使用try..catch,因为这是一个一次性的应用程序,所以我不会在生产环境中运行它。但我将使功能性Java成为长期解决方案。我觉得很干净。谢谢。由于线程安全问题,我经历了一个漫长的调试过程,我建议使用JODA。它是完全线程安全的,因为所有格式化程序和日期时间都是不可变的。这是一个非常有趣的答案。我一定要查找函数式Java。谢谢。在java8中,尽管docs()没有说它抛出任何东西,但代码表明它确实抛出了一些RuntimeException:(
Option<Date> d = parseWithPatterns(someString,
                                   stream("dd/MM/yyyy", "dd-MM-yyyy"));
if (d.isNone()) {
  // Handle the case where neither pattern matches.
} 
else {
  // Do something with d.some()
}
DateUtils.multiParse("1-12-12");
DateUtils.multiParse("2-24-2012");
DateUtils.multiParse("3/5/2012");
DateUtils.multiParse("2/16/12");




public class DateUtils {

    private static List<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();



    private Utils() {
        dateFormats.add(new SimpleDateFormat("MM/dd/yy")); // must precede yyyy
        dateFormats.add(new SimpleDateFormat("MM/dd/yyyy"));
        dateFormats.add(new SimpleDateFormat("MM-dd-yy"));
        dateFormats.add(new SimpleDateFormat("MM-dd-yyyy"));            

    }
        private static Date tryToParse(String input, SimpleDateFormat format) {
        Date date  = null;
        try {
            date = format.parse(input);
        } catch (ParseException e) {

        }

        return date;
    }

        public static Date multiParse(String input)  {
        Date date = null;
        for (SimpleDateFormat format : dateFormats) {
            date = tryToParse(input, format);
            if (date != null) break;
        }
        return date;
    }
}
    DateTimeFormatter ddmmmuuFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ENGLISH);
    DateTimeFormatter ddmmuuuuFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    String dateString = "07-Jun-09";

    LocalDate result;
    try {
        result = LocalDate.parse(dateString, ddmmmuuFormatter);
    } catch (DateTimeParseException dtpe) {
        result = LocalDate.parse(dateString, ddmmuuuuFormatter);
    }
    System.out.println("Date: " + result);
    String dateString = "07/06/2009";
    if (dateString.contains("-")) {
        result = LocalDate.parse(dateString, ddmmmuuFormatter);
    } else {
        result = LocalDate.parse(dateString, ddmmuuuuFormatter);
    }
    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("[dd-MMM-uu][dd/MM/uuuu]", Locale.ENGLISH);
    LocalDate result = LocalDate.parse(dateString, dateFormatter);