-1

我可以将 a 转换String为 a 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。我怎样才能做到这一点?

4

5 回答 5

3

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

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;
    }
}
于 2018-03-06T08:58:36.100 回答
2
  1. 您的代码存在多线程问题,最好在您的转换函数中本地创建以避免它(否则您将遇到多线程问题,因为此类不是线程安全的)

您的问题的答案是(使用旧的 Date api) - 您可以使用 Calendar 来做到这一点:

    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();
    }
于 2018-03-06T09:10:50.983 回答
2

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 检查,如果值无效则抛出异常)。

于 2018-03-06T12:29:39.310 回答
1
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' answerLocalDate中的课程。

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

于 2018-03-06T10:13:56.960 回答
1

你可以尝试这样的事情:

String[] arr = date.split("-");
String newDate = arr[0] + "-" + arr[1] + "-01";
于 2018-03-06T08:52:51.093 回答