更改字符串日期格式

10

我的当前日期格式为: 08/11/2008 00:00

我需要将输出转换为2008/11/08 00:00。然而,根据我的研究使用SimpleDateFormat无法完成此操作,它会给我一个完全不同的输出结果。以下是我的代码:

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm")
Date starting= simpleDateFormat2.parse(startTime);
System.out.println("" + simpleDateFormat2.format(starting) + " real date " + startTime);

我知道我正在解析正确的字符串,因为以下输出会出现:

0014/05/01 00:00 real date 08/11/2008 00:00
我对于机制如何检测出0014/05/01 00:00而不是2008/11/08 00:00并不确定。期待各位提供建议。提前致谢。

谢谢大家的建议!@madprogrammer 是的,这真的有效!我还发现另一件事就是将 .setLenient 设置为 false,但你的方法更好。 - Cosq
4个回答

13

你需要做的第一件事是将原始值解析为 Date 对象。

String startTime = "08/11/2008 00:00";
// This could be MM/dd/yyyy, you original value is ambiguous 
SimpleDateFormat input = new SimpleDateFormat("dd/MM/yyyy HH:mm");
Date dateValue = input.parse(startTime);

一旦完成这个步骤,你可以按照自己的意愿格式化dateValue...

SimpleDateFormat output = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println("" + output.format(dateValue) + " real date " + startTime);

输出结果为:

2008/11/08 00:00 real date 08/11/2008 00:00
你得到 0014/05/01 00:00 的原因是使用了 SimpleDateFormat(使用 yyyy/MM/dd HH:mm)将年份设为08,月份设为11,日期设为2008,它会对这些值进行内部滚动以使其成为有效的日期。

5
我可以为您提供现代化的答案。
    DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm");
    DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm");
    String startTime = "08/11/2008 00:00";
    LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter);
    System.out.println(starting.format(convertedOutputFormatter));

这会打印出来

2008/11/08 00:00

你尝试使用的SimpleDateFormat类已经过时且极易出现问题。你只是遇到了其中一点问题。相反,我正在使用并推荐使用现代Java日期和时间API java.time
正如其他人所说,你需要使用两个格式化程序,一个用于指定当前格式,另一个用于指定所需格式。
在你的代码中出了什么问题?
你的格式化程序使用格式模式yyyy/MM/dd HH:mm将08/11/2008解释为公元8年11月的第2008天。默认设置下,这不会影响SimpleDateFormat,因为11月只有30天,它会继续计入下一个月和年份,并最终落在五年半后的某个日期(2008除以365.25非常接近5.5)。
问题:我可以在我的Java版本中使用java.time吗?
如果至少使用Java 6,则可以。
  • 在Java 8及更高版本中,新API已内置。
  • 在Java 6和7中,获取ThreeTen Backport,即新类的后移(ThreeTen用于JSR 310,在该规范中首次描述了现代API)。
  • 在(较旧的)Android上,使用ThreeTen Backport的Android版。它被称为ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。
链接

4

这是因为您解析的源日期字符串与SimpleDateFormatter的格式不同。 您的源格式为MM/dd/yyyy HH:mm。 将SimpleDateFormat中的字符串更改为MM/dd/yyyy HH:mm

在第一个格式之后尝试使用另一种格式。

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("MM/dd/yyyy HH:mm");
//You gotta parse it to a Date before correcting it
Date parsedDate = simpleDateFormat2.parse(startTime);
simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm")
String newFormatttedDate = simpleDateFormat2.format(parsedDate);

1
我喜欢你的声望显示为365 :) - sguan
是的,像一年那么久了...刚刚注意到,谢谢你指出来...哈哈 - MetaSnarf
或者 dd/MM/yyyyy HH:mm,实际的 String 值是不明确的。 - MadProgrammer

0
你正在使用格式 yyyy/MM/dd HH:mm 解析日期 08/11/2008 00:00,但是这个日期不是这个格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接