java.util.Date格式转换为yyyy-mm-dd到mm-dd-yyyy
我有一个格式为yyyy-mm-dd
的java.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.Date
从yyyy-mm-dd
到mm-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 Month
, mm 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.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。
从何处获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
- Android的
- ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
- 请参阅如何使用ThreeTenABP …。
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。
请将小“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);