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;
我正在尝试更改 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;