以编程方式更改日期范围的日期格式

时间:2018-06-11 09:41:58

标签: java android date-formatting date-range android-date

我有一个应用程序,我想在' From'中更改日期格式。和' To'。

让我们假设,我有一个像2018-06-11 - 2018-06-14这样的日期范围。现在,我想以其他格式更改为11 June, 2018 - 14 June, 2018

请参考下面的代码,我尝试过:

        String strDate = "2018-06-11 - 2018-06-14";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = format.parse(strDate);
            format = new SimpleDateFormat("dd MMMM, yyyy");
            String strFinalDate = format.format(date);
            tv4.setText(strFinalDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

另外,我也尝试了下面的代码:

        String strDate = "2018-06-11 - 2018-06-14";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd - yyyy-MM-dd");
        try {
            Date date = format.parse(strDate);
            format = new SimpleDateFormat("dd MMMM, yyyy - dd MMMM, yyyy");
            String strFinalDate = format.format(date);
            tv4.setText(strFinalDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

首先,代码集运行顺畅,但仅转换' From'并且甚至不检查' To'日期。 并且,第二组代码返回一个错误,表示java.text.ParseException: Unparseable date: "2017-01-11 - 2017-01-14

我是否跳过此代码中的任何内容?

如果有,请通知我。

谢谢!

2 个答案:

答案 0 :(得分:2)

我建议

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
    String strDate = "2018-06-11 - 2018-06-14";
    String[] strDates = strDate.split(" - ");
    if (strDates.length != 2) {
        throw new IllegalStateException("Wrong range format " + strDate 
                + ", must be yyyy-MM-dd - yyyy-MM-dd");
    }
    String strFinalDate = LocalDate.parse(strDates[0]).format(dateFormatter)
            + " - " + LocalDate.parse(strDates[1]).format(dateFormatter);
    System.out.println(strFinalDate);

使用美国英语语言环境在我的Java上输出:

  

2018年6月11日 - 2018年6月14日

你在“六月”之后没有得到逗号,因为这不是标准的,所以考虑一下这不是一个真正的优势。输出将取决于区域设置,这也可能是一个优势。或者指定显式语言环境,例如:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.UK);

我正在使用并推荐java.time,现代Java日期和时间API。

您的代码出了什么问题?

无论您使用旧的Date还是现代的LocalDate,这样的对象只能包含一个日期,而不是日期范围。在您第一次尝试时SimpleDateFormat解析了第一个日期(因为它与您的模式匹配),然后忽略了字符串的其余部分。所以当你格式化解析日期时,你得到了

  

2018年6月11日

在秒尝试中,两个日期都被解析,但是被分析到同一个Date对象中,所以只保留了第二个日期的值。打印日期时,其值也会打印两次,因为格式化的格式包含格式两次:

  

2018年6月14日 - 2018年6月14日

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:0)

正如我在上面的评论中所述,您必须将strDate String分成两个不同的String变量。看看下面的代码

    String strDate = "2018-06-11 - 2018-06-14";
    String[] fromToDatesStr = strDate.split(" - ");
    String fromDateStr = fromToDatesStr[0];
    String toDateStr = fromToDatesStr[1];
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date fromDate = null;
    Date toDate = null;
    try {
        fromDate = format.parse(fromDateStr);
        toDate = format.parse(toDateStr);
        format = new SimpleDateFormat("dd MMMM, yyyy");
        String strFromFinalDate = format.format(fromDate);
        String strToFinalDate = format.format(toDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }

String strFromFinalDateString strToFinalDate现在包含根据您的需要格式化的日期。