我需要将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
类一起使用。
因此,我建议您将过时的类SimpleDateFormat
和Date
放在肩膀上。 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有用)。年份使用小写字母uu
或yy
(不是大写字母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