我需要将String解析为dd/MM/YY hh:mm:ss格式。

假设如果String的值为09/06/17 05:59:59,则应对其进行解析,但是如果String的值为09/06/2017 05:59:59,则这也是有效的格式,并且需要对其进行解析,但是在我的要求下,应该为后来。

码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {

    public static void main(String[] args) {

        String line=" 09/06/17 05:59:59 20170609IT36701706080107 42 103 Output USD 970.20 IT3670";
        //String line=" 09/06/2017 05:59:59 20170609IT36701706080107 42 103 Output USD 970.20 IT3670";

        String dt=null;
        dt=line.substring(1, 19);

        SimpleDateFormat org_format = new SimpleDateFormat("dd/MM/YY hh:mm:ss");
        SimpleDateFormat tgt_format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
              dt=line.substring(1, 19);

              System.out.println(dt);
              Date date = org_format.parse(dt);
              System.out.println(date);

              String tgt_date=tgt_format.format(date);
              System.out.println(tgt_date);
         } catch (ParseException e) {
              System.out.println(line);
         }
    }
}


问题-在代码中,未注释的行变量和注释的行变量都成功给出了结果。但注释行应引发可解析的异常,因为它是模式dd/MM/yyyy,而不是dd/MM/yy

fmt.setLenient(false)不起作用。

我正在使用Java7。没有使用Java 8或更高版本的选项,因此不能使用java.time

最佳答案

没有选择使用Java 8或更高版本的选项,因此不能使用java.time


Java 8日期和时间类已被反向移植到Java 6和7,因此可以,您可以在Java 7中使用它们。获取ThreeTen Backport。这也是对未来的投资:如果最终要升级到Java 8或9,则只需修改import声明,代码就可以与java.time类一起使用。

因此,我建议您将过时的类SimpleDateFormatDate放在肩膀上。 SimpleDateFormat在您想要例外的情况下为您提供结果(通常是不正确的结果)是非常典型的。如您所述,有时org_format.setLenient(false);会有所帮助,但对于您而言并非如此。

使用ThreeTen Backport:

    DateTimeFormatter originalFormat = DateTimeFormatter.ofPattern("dd/MM/uu HH:mm:ss");
    ParsePosition pos = new ParsePosition(1); // skip leading space
    LocalDateTime ldt = LocalDateTime.from(originalFormat.parse(line, pos));


这会将您的行以两位数的年份解析为

2017-01-02 05:59:59


对于年份为4位数字的行,“在我的要求下,应引发解析异常”,我们得到


  线程“主”中的异常java.time.format.DateTimeParseException:
  文字'09/06/2017 05:59:59 20170609IT36701706080107 42103输出USD
  ...'无法在索引9处解析


它说的是索引9,即在17中的2017处,也就是恰好应该只有两位数字的年份的第三位数字。

需要注意的几点:


在一天中的小时格式格式中使用大写字母HH(小的hh用于AM或PM的小时,仅对AM / PM marler有用)。年份使用小写字母uuyy(不是大写字母YY,适用于基于周的年份,仅适用于星期号)。顺便说一句,再次SimpleDateFormat让您摆脱这些错误,有时会给您不正确的结果。现代类将通过抛出异常来反对。
我的代码将解析为从2000年到2099年的一年。请检查这是否是您想要的。您可能需要施加其他限制,例如,日期时间应该在过去且不超过5年,以增强验证。你比我知道的多。


转换为目标格式:

    DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String targetDate = ldt.format(targetFormat);


使用前几行,结果是

2017-01-02 05:59:59

07-24 09:46
查看更多