更改日期格式
Changing date formats
我有以下代码:
// OLD DATE
String date = "Mon, 06/07";
DateFormat df = new SimpleDateFormat("MM/dd");
String strDate = date.substring(date.length() - 5);
Date dateOld;
try {
dateOld = df.parse(strDate);
} catch (Exception e) {
e.printStackTrace();
}
String dateStr = df.format(dateOld);
MonthDay monthDay = MonthDay.parse(dateStr, DateTimeFormatter.ofPattern("MM/dd"));
ZonedDateTime dateNew = ZonedDateTime.now().with(monthDay);
// NEW DATE
System.out.println(dateNew.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T00:00:00Z'")));
基本上我想要做的是将 Mon, 06/07
格式更改为这种格式 2021-06-07T00:00:00Z
。
我有什么用,但真的很糟糕。更好的方法是什么?
这有点棘手,因为您需要做出一些假设
- 年份,因为它在原始格式中没有指定
- TimeZone,因为它根本没有指定(最终输出似乎指向 UTC)
您需要做的第一件事是将 String
输入解析为 LocalDate
(您可以直接转到 ZonedDate
,但这是我开始的地方)
String date = "Mon, 06/07";
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
.appendPattern("E, M/d")
.parseDefaulting(ChronoField.YEAR, 2021)
.toFormatter(Locale.US);
LocalDate ld = LocalDate.parse(date, parseFormatter);
然后您需要将其转换为 LocalDateTime
LocalDateTime ldt = ld.atStartOfDay();
然后,到了ZonedDateTime
。在这里,我假设 UTC
//ZoneId zoneId = ZoneId.systemDefault();
//ZonedDateTime zdt = ldt.atZone(zoneId);
OffsetDateTime zdt = ldt.atOffset(ZoneOffset.UTC);
最后,将结果格式化为您想要的格式
String formatted = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(formatted);
对我来说,打印...
2021-06-07T00:00:00Z
新的 Date/Time API 投入了大量时间和精力,您应该抽出时间尝试并尽可能地学习它们(我很生疏,但稍加修修补补,得到结果)
也许从 Date/Time trails
开始
解决方案使用 Calendar
、Date
和 SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("EEE, MM/dd", Locale.getDefault());
try {
Date oldDate = sdf.parse("Mon, 06/07");
Calendar calendar = Calendar.getInstance();
int savedYear = calendar.get(Calendar.YEAR);
if (oldDate != null) {
calendar.setTime(oldDate);
calendar.set(Calendar.YEAR, savedYear);
sdf.applyPattern("yyyy-MM-dd'T00:00:00Z'");
System.out.println(sdf.format(calendar.getTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
我有以下代码:
// OLD DATE
String date = "Mon, 06/07";
DateFormat df = new SimpleDateFormat("MM/dd");
String strDate = date.substring(date.length() - 5);
Date dateOld;
try {
dateOld = df.parse(strDate);
} catch (Exception e) {
e.printStackTrace();
}
String dateStr = df.format(dateOld);
MonthDay monthDay = MonthDay.parse(dateStr, DateTimeFormatter.ofPattern("MM/dd"));
ZonedDateTime dateNew = ZonedDateTime.now().with(monthDay);
// NEW DATE
System.out.println(dateNew.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T00:00:00Z'")));
基本上我想要做的是将 Mon, 06/07
格式更改为这种格式 2021-06-07T00:00:00Z
。
我有什么用,但真的很糟糕。更好的方法是什么?
这有点棘手,因为您需要做出一些假设
- 年份,因为它在原始格式中没有指定
- TimeZone,因为它根本没有指定(最终输出似乎指向 UTC)
您需要做的第一件事是将 String
输入解析为 LocalDate
(您可以直接转到 ZonedDate
,但这是我开始的地方)
String date = "Mon, 06/07";
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
.appendPattern("E, M/d")
.parseDefaulting(ChronoField.YEAR, 2021)
.toFormatter(Locale.US);
LocalDate ld = LocalDate.parse(date, parseFormatter);
然后您需要将其转换为 LocalDateTime
LocalDateTime ldt = ld.atStartOfDay();
然后,到了ZonedDateTime
。在这里,我假设 UTC
//ZoneId zoneId = ZoneId.systemDefault();
//ZonedDateTime zdt = ldt.atZone(zoneId);
OffsetDateTime zdt = ldt.atOffset(ZoneOffset.UTC);
最后,将结果格式化为您想要的格式
String formatted = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(formatted);
对我来说,打印...
2021-06-07T00:00:00Z
新的 Date/Time API 投入了大量时间和精力,您应该抽出时间尝试并尽可能地学习它们(我很生疏,但稍加修修补补,得到结果)
也许从 Date/Time trails
开始解决方案使用 Calendar
、Date
和 SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("EEE, MM/dd", Locale.getDefault());
try {
Date oldDate = sdf.parse("Mon, 06/07");
Calendar calendar = Calendar.getInstance();
int savedYear = calendar.get(Calendar.YEAR);
if (oldDate != null) {
calendar.setTime(oldDate);
calendar.set(Calendar.YEAR, savedYear);
sdf.applyPattern("yyyy-MM-dd'T00:00:00Z'");
System.out.println(sdf.format(calendar.getTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}