java.util.Date格式转换为yyyy-mm-dd到mm-dd-yyyy

我有一个格式为yyyy-mm-ddjava.util.Date 。 我希望它的格式是mm-dd-yyyy

以下是我尝试进行此转换的示例util:

 // Setting the pattern SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy"); // myDate is the java.util.Date in yyyy-mm-dd format // Converting it into String using formatter String strDate = sm.format(myDate); //Converting the String back to java.util.Date Date dt = sm.parse(strDate); 

不过我得到的输出不是格式mm-dd-yyyy

请让我知道如何格式化一个java.util.Dateyyyy-mm-ddmm-dd-yyyy

Date是自Unix纪元(1970年1月1日00:00:00 UTC)以来的毫秒数的容器。

它没有格式的概念。

例如…

 Date myDate = new Date(); System.out.println(myDate); System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate)); System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate)); System.out.println(myDate); 

输出…

 Wed Aug 28 16:20:39 EST 2013 08-28-2013 2013-08-28 Wed Aug 28 16:20:39 EST 2013 

格式都没有改变基础的Date值。 这是DateFormatter的目的

更新了另外的例子

以防万一第一个例子没有意义

此示例使用两个格式化程序来格式化相同的date。 然后,我使用这些相同的格式化程序将String值parsing回Date 。 由此产生的parsing不会改变Date报告它的价值的方式。

Date#toString只是它的内容转储。 你不能改变这个,但是你可以用任何你喜欢的方式格式化Date对象

 try { Date myDate = new Date(); System.out.println(myDate); SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy"); SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd"); // Format the date to Strings String mdy = mdyFormat.format(myDate); String dmy = dmyFormat.format(myDate); // Results... System.out.println(mdy); System.out.println(dmy); // Parse the Strings back to dates // Note, the formats don't "stick" with the Date value System.out.println(mdyFormat.parse(mdy)); System.out.println(dmyFormat.parse(dmy)); } catch (ParseException exp) { exp.printStackTrace(); } 

哪个输出…

 Wed Aug 28 16:24:54 EST 2013 08-28-2013 2013-08-28 Wed Aug 28 00:00:00 EST 2013 Wed Aug 28 00:00:00 EST 2013 

另外,请注意格式模式。 仔细看看SimpleDateFormat ,确保你没有使用错误的模式;)

 SimpleDateFormat("MM-dd-yyyy"); 

代替

 SimpleDateFormat("mm-dd-yyyy"); 

因为MM points Monthmm points minutes

 SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy"); String strDate = sm.format(myDate); 

“M”(Capital)表示月份“m”(简单)表示分钟

几个月的例子

 'M' -> 7 (without prefix 0 if it is single digit) 'M' -> 12 'MM' -> 07 (with prefix 0 if it is single digit) 'MM' -> 12 'MMM' -> Jul (display with 3 character) 'MMMM' -> December (display with full name) 

几分钟的例子

 'm' -> 3 (without prefix 0 if it is single digit) 'm' -> 19 'mm' -> 03 (with prefix 0 if it is single digit) 'mm' -> 19 

TL;博士

 LocalDate.parse( "01-23-2017" , DateTimeFormatter.ofPattern( "MM-dd-uuuu" ) ) 

细节

我有一个格式为yyyy-mm-dd的java.util.Date

正如其他提到的, Date类没有格式。 从UTC 1970年开始,它有一个毫秒的计数。 没有任何附加条件。

java.time

其他答案使用麻烦的旧的遗留date时间类,现在由java.time类代替。

如果你有一个java.util.Date ,转换为一个Instant对象。 Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

 Instant instant = myUtilDate.toInstant(); 

时区

其他答案忽略了时区的关键问题。 确定一个date需要一个时区。 对于任何特定的时刻,date在全球各地按照地区而不同。 巴黎午夜过后几分钟,法国是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

定义您的Instant上下文的时区。

 ZoneId z = ZoneId.of( "America/Montreal" ); 

应用ZoneId以获取ZonedDateTime

 ZonedDateTime zdt = instant.atZone( z ); 

LocalDate

如果您只关心date而没有时间,请提取一个LocalDate

 LocalDate localDate = zdt.toLocalDate(); 

要生成标准ISO 8601格式的stringYYYY-MM-DD,只需调用toString 。 在生成/parsingstring时,java.time类默认使用标准格式。

 String output = localDate.toString(); 

2017年1月23日

如果您需要MM-DD-YYYY格式,请定义格式模式。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" ); String output = localDate.format( f ); 

请注意,格式化模式代码区分大小写。 问题中的代码错误地使用了mm (分钟),而不是MM (年份)。

使用相同的DateTimeFormatter对象进行分析。 java.time类是线程安全的,所以你可以保留这个对象,甚至在线程之间重复使用它。

 LocalDate localDate = LocalDate.parse( "01-23-2017" , f ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

请将小“mm”月份更改为大写“MM”,以便参考。以下是参考代码。

  **Date myDate = new Date(); SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy"); String strDate = sm.format(myDate); Date dt = sm.parse(strDate); System.out.println(strDate);** 

下面的代码很简单。

 final Date todayDate = new Date(); System.out.println(todayDate); System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate)); System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate)); System.out.println(todayDate);