我在简单的日期格式方面遇到了很大的困难。首先,我知道并非所有网站上的所有教程都是好的,但事实上所有非平凡的格式(不是dd / MM / yyyy)给出了一个解析异常(加上我自己的测试不能按预期工作)对我来说是相当令人沮丧的。
这是相关网站:http://www.mkyong.com/java/how-to-convert-string-to-date-java/
我不明白为什么这么简单:
private static void unexpectedFailure() {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
String dateInString = "7-Jun-2013";
try {
Date date = formatter.parse(dateInString);
System.out.println(date);
System.out.println(formatter.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
抛出一个解析异常。
除此之外,我还试图解析自己的约会。这段代码给出了奇怪的结果(我想说的意外):
public static void doSomething(List<String> list) {
Iterator<String> iter = list.iterator();
String[] line = iter.next().split(" ");
System.out.println(Arrays.toString(line));
DateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
format.setLenient(true);
try {
System.out.println(line[0]+" "+line[1]);
System.out.println(format.parse(line[0]+" "+line[1]));
} catch (ParseException e) {
System.out.println("In theory this should not get caught.");
}
}
打印出来:
[06/08/2015, 13:51:29:849, DEBUG, etc...]
06/08/2015 13:51:29:849
Thu Aug 06 13:51:29 EEST 2015
Thu Aug 06 13:51:29 EEST 2015
什么?为什么?
编辑我会尝试解释。在我的上一段代码片段中,我只想确定字符串是否为日期,然后通过&#34;测试&#34;。然而,当我将它打印出来时,这种格式简直就是古怪。我开始认为这是因为我打印了一个约会。我怎么能打印DateFormat?我期待的是dd/MM/yyyy hh:mm:ss
而非ddd MMM 06? hh:mm:ss G YYYY
答案 0 :(得分:3)
我不明白为什么这么简单:
(代码剪断)
抛出一个解析异常。
我的猜测是,它在Jun
上绊倒,这可能不是系统默认语言环境中的有效月份缩写。我建议您在SimpleDateFormat
构造函数中指定区域设置:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);
然后你正在处理一个肯定具有Jun
月份缩写的语言环境。
那就是说,在可能的情况下,我建议在可能的地方使用数字格式,理想情况下是符合ISO-8601的格式,例如
yyyy-MM-dd'T'HH:mm:ss
然而,当我将它打印出来时,这种格式很简单。
不,不是。你正在有效地使用
Date date = format.parse(line[0]+" "+line[1]);
System.out.println(date);
因此,我们将Date.toString()
,documented称为:
将此Date对象转换为以下形式的字符串:
dow mon dd hh:mm:ss zzz yyyy
这样按预期工作。但是,您希望使用SimpleDateFormat
格式化日期 - 因此您需要致电format
:
System.out.println(format.format(date));
当然,只是检查它是否可以往返。
作为旁注,我怀疑你的格式字符串中需要HH
(24小时制)而不是hh
(12小时制)。