将字符串转换为日期并删除日期值(始终设置每月 1 天)



我可以将String转换为Date

private static final SimpleDateFormat CARD_DATE_FORMAT = new SimpleDateFormat("yyMMdd", Locale.getDefault());
public static Date toCardDateFormat(String date){
try {
return CARD_DATE_FORMAT.parse(date);
} catch (ParseException e) {
return null;
}
}

例如,我有200908- 它将转换为2020-09-08,但我需要将日期始终设置为每月的第一天。我需要2020-09-01.我该怎么做?

根据您的需要,您可以使用此方法:

private static final SimpleDateFormat CARD_DATE_FORMAT = new SimpleDateFormat("yyMMdd", Locale.getDefault());
public static String toCardDateFormat(String date) {
try {
Date value = CARD_DATE_FORMAT.parse(date);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yy-MM", Locale.getDefault());
String datetimeLocale = dateFormatter.format(value);
String newDate = datetimeLocale + "-01";
return newDate;
} catch (ParseException e) {
return null;
}
}

对于日期对象,您可以使用以下内容:

public static Date toCardDateFormat(String date) {
try {
Date value = CARD_DATE_FORMAT.parse(date);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yy-MM", Locale.getDefault());
String datetimeLocale = dateFormatter.format(value);
String newDate = datetimeLocale + "-01";
SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd",Locale.getDefault());
Date d = dateFormat.parse(newDate);

return d;
} catch (ParseException e) {
return null;
}
}

Maciej的回答是正确的,但是如果你使用Java 8或更高版本,最好使用java.time类:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
// parse and change the day of month
LocalDate d = LocalDate.parse("200908", formatter).withDayOfMonth(1);
System.out.println(d); // 2020-09-01

请注意,LocalDate以您想要的格式打印 - 这ISO8601兼容。如果需要不同的格式,只需使用其他DateTimeFormatter并调用format方法。

按照其他人的建议手动更改字符串也可能有效,但是如果您正在处理日期,为什么不使用适当的日期处理 API?在无效日期(格式化程序将针对无效输入引发异常)或尝试将日期更改为无效值(例如 4 月的第 31 天或非闰年的 2 月第 29 天,API 会检查这些值并在值无效时引发异常)的情况下,直接字符串操作将无济于事。

  1. 您的代码存在多线程问题,最好在转换函数中本地创建以避免它(否则您将遇到多线程问题,因为此类不是线程安全的)

您的问题的答案是(使用旧的日期 api) - 您可以使用日历来执行此操作:

public static Date toCardDateFormat(String date){
Date result = null;
try {
result = new SimpleDateFormat("yyMMdd", Locale.getDefault()).parse(date);
} catch (ParseException e) {
return null; // or better throw exception or return Optional.empty()
}
Calendar cal = Calendar.getInstance();
cal.setTime(result);
cal.set(Calendar.DAY_OF_MONTH, 1);
return cal.getTime();
}

你可以尝试这样的事情:

String[] arr = date.split("-");
String newDate = arr[0] + "-" + arr[1] + "-01";
private static final DateTimeFormatter CARD_DATE_FORMAT
= DateTimeFormatter.ofPattern("yyMMdd", Locale.getDefault());
public static Optional<YearMonth> toCardDateFormat(String date) {
try {
return Optional.of(YearMonth.parse(date, CARD_DATE_FORMAT));
} catch (DateTimeParseException e) {
return Optional.empty();
}
}

不要从方法返回null。呼叫者一方发生NullPointerException的风险会很大。如果您认为在字符串格式错误或包含无效日期的情况下不返回值是正确的做法,请使用Optional强制调用方考虑不返回值的可能性。另一个明显的选择是将任何解析异常留给调用方:

public static YearMonth toCardDateFormat(String date) {
return YearMonth.parse(date, CARD_DATE_FORMAT);
}

DateTimeParseException是未经检查的异常,因此不需要在方法签名中声明。让我们试试吧:

System.out.println(toCardDateFormat("200908"));

这将打印:

2020年09月

其他消息:

  • 我正在使用并热情推荐java.time,现代Java日期和时间API。Java 1.0 和 1.1 中的旧日期时间类现在早已过时,尤其是SimpleDateFormat出了名的麻烦。我认为你应该避免它们。现代 API 使用起来要好得多。
  • 看来你真的更愿意删除月份中的某一天,所以你只有月份和年份?java.time 的YearMonth类正是为你做的。如果你想要一个完整的日期,请使用 xunts 答案中的LocalDate类。

链接:Oracle 教程:日期时间解释如何使用java.time

相关内容

  • 没有找到相关文章

最新更新