小编典典

Java日期更改格式[重复]

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


阅读 214

收藏
2020-09-23

共1个答案

小编典典

请尝试将两个概念区分开:您的数据和向用户呈现的数据(或用于其他目的的格式设置,例如包含在JSON中)。的int保持值7可以表示为(格式化成)7,07,007或7,同时仍保持刚好相同的值而没有任何格式化信息-
外的格式化谎言int。同样,a 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,则大多数其他较新的日期和时间类型可以使用相同的方式以完全相同的方式进行格式化DateTimeFormatterInstant在这方面有一点特殊之处,因为它不包含日期,但是您可以例如myInstant.atZone(ZoneId.of("Europe/Oslo")).format(dateFormatter)获取该日期在奥斯陆所在时区的日期。

现代类是在Java 8中引入的,在Java 9中得到了一些增强。它们已在ThreeTen
Backport中
向后移植到Java
6和7,其中包括适用于Android的特殊版本ThreeTenABP。因此,我真的没有理由不解释为什么您不希望在自己的代码中使用它们。

2020-09-23