Java日期更改格式
我试图更改Date
对象的格式,我试图这样做:
for(Date date : dates){ DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); String formatterDate = formatter.format(date); Date d = formatter.parse(formatter.format(date)); }
但是这对d
对象没有任何影响,它仍然采用旧格式,无法真正理解为什么会这样。
请尝试将两个概念区分开来:您的数据和向用户呈现数据(或格式化用于其他目的,例如包含在JSON中)。 保持值为7的int
可以表示为(格式化为)7,07,007或+7,同时仍保持相同的值而没有任何格式信息 – 格式位于int
之外。 同样, Date
持有一个时间点,它可以表示为(格式化为)“2017年6月1日,12:46:01.169”,“2017/06/01”或“2017年6月1日”,同时仍然只是持有没有任何格式信息的相同值 – 格式位于Date
之外。
根据您的要求,一个选项是您将日期存储为Date
(或更好,一个现代日期和时间类之一的实例,如LocalDate
)并保留一个格式化程序,以便您可以在每次需要显示它时格式化它给用户。 如果这不起作用并且您需要以特定格式存储日期,则将其存储为String
。
Java 8(7,6)日期和时间API
现在我一直在评论在评论中使用较新的Java日期和时间类,所以不告诉你它们有效是不公平的。 该问题尝试格式化为yyyy-MM-dd
,我们可以使用以下代码进行格式化。
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd"); for (LocalDate date : localDates) { String formatterDate = date.format(dateFormatter); System.out.println(formatterDate); }
我得到了一次
2017/05/23 2017/06/01
如果列表中的对象具有除LocalDate
之外的其他类型,则大多数其他较新的日期和时间类型可以使用相同的DateTimeFormatter
以完全相同的方式进行格式化。 Instant
在这方面有点特别,因为它不包含日期,但你可以做例如myInstant.atZone(ZoneId.of("Europe/Oslo")).format(dateFormatter)
来获取它的日期/那一刻将在奥斯陆的时区。
现代类是在Java 8中引入的,并且在Java 9中得到了一些增强。它们已经被移植到ThreeTen Backport中的Java 6和7以及Android的特殊版本ThreeTenABP 。 所以我真的没有理由不在你自己的代码中使用它们。
试试这个。
String formattedDate = null; SimpleDateFormat sdf = new SimpleDateFormat(format you want); formattedDate = sdf.format( the date you want to format ); return formattedDate;
一些不是最好的解决方案,但它的工作原理:此方法将Date对象转换为您需要的任何模式的String
public static void format(Date date){ String pattern = "MMM d yyyy"; LocalDateTime localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); String result = formatter.format(localDate); // new Date() -> Jun 1 2017 }
SimpleDateFormat
在将Date
转换为String
非常有用,反之亦然。 java.util.Date
格式将始终保持不变。 如果要在独立应用程序中显示它,请使用date.getxxx()
方法并选择您的设计。