更改字符串日期格式

Cle*_*Ong 6 java date simpledateformat

我目前的日期格式是: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);
Run Code Online (Sandbox Code Playgroud)

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

0014/05/01 00:00 real date 08/11/2008 00:00
Run Code Online (Sandbox Code Playgroud)

我不太确定机械师如何检测到0014/05/01 00:00而不是

2008/11/08 00:00

我期待所有的建议提前谢谢

Mad*_*mer 8

您需要做的第一件事是将原始值解析为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);
Run Code Online (Sandbox Code Playgroud)

完成后,您可以dateValue按照您想要的任何方式格式化...

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

哪个输出:

2008/11/08 00:00 real date 08/11/2008 00:00
Run Code Online (Sandbox Code Playgroud)

您获得的原因0014/05/01 00:00SimpleDateFormat(当使用时yyyy/MM/dd HH:mm)正在使用08年份,11月份和2008当天,它正在内部滚动值以将值更正为有效日期


Ole*_*.V. 5

我想贡献现代答案。

\n\n
    DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm");\n    DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm");\n    String startTime = "08/11/2008 00:00";\n    LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter);\n    System.out.println(starting.format(convertedOutputFormatter));\n
Run Code Online (Sandbox Code Playgroud)\n\n

这打印

\n\n
2008/11/08 00:00\n
Run Code Online (Sandbox Code Playgroud)\n\n

您尝试使用的类SimpleDateFormat早已过时并且非常麻烦。你已经经历过一些麻烦了。相反,我正在使用并推荐java.time现代 Java 日期和时间 API。

\n\n

正如其他人所说,您需要使用两种格式化程序,一种用于指定当前格式,另一种用于指定所需格式。

\n\n

你的代码出了什么问题?

\n\n

您的格式化程序yyyy/MM/dd HH:mm将 08/11/2008 解释为通用时代第 8 年第 11 个月的第 2008 天。它不会干扰 11 月SimpleDateFormat只有 30 天的默认设置,它只是继续计数接下来的月份和年份,最终得出五年半后的日期(2008 年除以 365.25 为非常接近 5.5)。

\n\n

问:我可以使用java.time我的 Java 版本吗?

\n\n

如果至少使用Java 6,则可以。

\n\n
    \n
  • 在 Java 8 及更高版本中,新的 API 是内置的。
  • \n
  • 在 Java 6 和 7 中,获得 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310,其中首次描述了现代 API)。
  • \n
  • 在(较旧的)Android 上,使用 ThreeTen Backport 的 Android 版本。它\xe2\x80\x99s 称为ThreeTenABP。确保从包org.threeten.bp和子包导入日期和时间类。
  • \n
\n\n

链接

\n\n\n


tka*_*usl 0

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