更改字符串日期格式

时间:2016-01-18 02:24:27

标签: 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);

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

0014/05/01 00:00 real date 08/11/2008 00:00

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

2008/11/08 00:00

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

4 个答案:

答案 0 :(得分: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);

完成后,您可以按照自己想要的方式格式化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 {1}}当天,它正在内部滚动值以将值更正为有效日期

答案 1 :(得分:3)

这是因为您解析的源日期字符串格式与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);

答案 2 :(得分:2)

我想提供现代答案。

    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.time,现代Java日期和时间API。

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

您的代码出了什么问题?

您格式化格式为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,这是新类的后端(JST 310的ThreeTen,其中首次描述了现代API)。
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。

链接

答案 3 :(得分:0)

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