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()方法并选择您的设计。