Java 日期更改格式

Java Date changing format

我正在尝试更改 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对象没有任何影响,它仍然是旧格式,无法理解为什么会这样。

有些不是最佳解决方案,但它有效:此方法会将日期对象转换为您需要的任何模式的字符串

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
 }

请尽量区分两个概念:您的数据和向用户展示的数据(或出于其他目的而格式化,例如包含在 JSON 中)。包含值 7 的 int 可以表示为(格式化为)7、07、007 或 +7,同时仍然只包含相同的值而没有任何格式信息——格式位于 int 之外。同样,一个 Date 保存一个时间点,它可以表示为(格式化为)“June 1st 2017, 12:46:01.169”, “2017/06/01” or “1 Jun 2017”,同时仍然保持相同的值而没有任何格式信息——格式位于 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) 来获取 was/will 那一刻在奥斯陆时区的日期.

现代 类 是在 Java 8 中引入的,在 Java 9 中得到了一些增强。它们已被移植到 Java 6 和 7 ThreeTen Backport with a special edition for Android, ThreeTenABP。所以我真的看不出您为什么不喜欢在自己的代码中使用它们。

SimpleDateFormat 在将 Date 转换为 String 时很有用,反之亦然。 java.util.Date 格式将始终保持不变。如果您想在独立应用程序中显示它,请使用 date.getxxx() 方法并选择您的设计。

试试这个。

String formattedDate = null;
    SimpleDateFormat sdf = new SimpleDateFormat(format you want);
    formattedDate = sdf.format( the date you want to format );
   return formattedDate;