我有一个java.util.Date,格式为yyyy-mm-dd。 我希望它的格式为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
您说的是什么意思。我有一个格式为yyyy-mm-dd的java.util.Date?
这意味着我的代码中用于显示到UI的当前格式为yyyy-mm-dd。
请把小毫米改为毫米
Date是一个容器,用于存储自Unix纪元(1970年1月1日00:00:00 UTC)以来的毫秒数。
它没有格式的概念。
Java 8+
LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);
输出...
05-11-
-05-11
-05-11T17:24:42.980
Java 7-
您应该利用ThreeTen Backport
原始答案
例如...
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
08-28-
-08-28
Wed Aug 28 16:20:39 EST
没有一种格式更改了基础Date值。这是DateFormatter的目的
更新了其他示例
万一第一个例子没有道理...
本示例使用两个格式化程序来格式化同一日期。然后,我使用这些相同的格式化程序将String值解析回Date s。结果分析不会改变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
08-28-
-08-28
Wed Aug 28 00:00:00 EST
Wed Aug 28 00:00:00 EST
另外,请注意格式模式。仔细研究SimpleDateFormat,以确保您使用的不是错误的模式;)
好答案对我有所帮助。 试图运行命令行示例应用程序以测试格式(在Android类中使用之前)-找不到我需要的导入。 提供的答案中没有一个记得包含以下内容:import java.text.SimpleDateFormat;
代替
因为MM points Month,mm points minutes
SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
除了此更改之外,我还需要在上述util方法中进行任何其他更改吗? 我无法立即对其进行测试,因此提出了这一要求。 另外,还有什么更好的格式化java.util.Date的方法吗?
@ user182944您可以在这里自己测试
" M"(大写)代表月份," 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; dr
LocalDate.parse(
"01-23-" ,
DateTimeFormatter.ofPattern("MM-dd-uuuu" )
)
细节
I have a java.util.Date in the format yyyy-mm-dd
如其他提到的,Date类没有格式。自1970年UTC以来,它的毫秒数为单位。没有任何附加条件。
java.time
其他答案使用麻烦的旧式旧式日期时间类,现在由java.time类取代。
如果您有java.util.Date,请转换为Instant对象。 Instant类表示UTC时间轴上的时刻,分辨率为纳秒(十进制小数的九(9)位)。
Instant instant = myUtilDate.toInstant();
时区
其他答案则忽略了时区这一关键问题。确定日期需要一个时区。在任何给定时刻,日期都会在全球范围内变化。在巴黎午夜过后几分钟,法国是新的一天,而在魁北克蒙特利尔仍然是"昨天"。
定义您想要Instant上下文的时区。
ZoneId z = ZoneId.of("America/Montreal" );
应用ZoneId获得ZonedDateTime。
ZonedDateTime zdt = instant.atZone( z );
LocalDate
如果只关心日期而不是时间,请提取LocalDate。
LocalDate localDate = zdt.toLocalDate();
要生成标准ISO 8601格式的字符串YYYY-MM-DD,只需调用toString。生成/解析字符串时,默认情况下java.time类使用标准格式。
String output = localDate.toString();
-01-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-" , f );
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧式旧式日期时间类,例如java.util.Date,Calendar和SimpleDateFormat。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
Java SE 8和SE 9及更高版本
内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。
Java SE 6和SE 7
java.time的许多功能在ThreeTen-Backport中都被反向移植到Java 6和7。
安卓系统
ThreeTenABP项目专门针对Android改编了ThreeTen-Backport(如上所述)。
请参阅如何使用ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter等。
下面的代码很容易使用。
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);
(A)此代码忽略了时区的关键问题。 (B)此代码使用了麻烦的旧日期时间类,这些类已经存在多年了。 避免他们。 由java.time类取代。
请将小写的" 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);**