【问题标题】:Changing the date format for a date range programmatically以编程方式更改日期范围的日期格式
【发布时间】:2018-11-20 12:36:03
【问题描述】:

我有一个应用程序,我想更改“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

我是否跳过了这段代码中的任何内容?

如果有请通知我。

谢谢!

【问题讨论】:

  • 这些包已弃用尝试日期和时间
  • @Lokesh 我必须使用这个..
  • 我会说从String strDate = "2018-06-11 - 2018-06-14"; 获取日期并使用- 拆分日期,然后更改格式,然后使用- 附加它
  • String strDate = "2018-06-11 - 2018-06-14"; 拆分为两个不同的String 变量,例如String fromDate = "2018-06-11";String toDate = 2018-06-14"; 然后尝试解析和格式化这两个字符串。
  • 谢谢伙计!成功了!!

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


【解决方案1】:

正如我在上面的评论中所说,您必须将您的 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 现在包含您想要的日期格式。

【讨论】:

  • 这就是我在你面前的评论中写的。但是你为什么不让OP试试呢?
  • @Lokesh 这也是我在评论中所写的内容(与您的评论几乎同时发布)。但是,我看不出有什么理由不回答 OP 问题。
  • 你有权回答,但我相信给出逻辑和给出解决方案的区别
  • 如果给定的逻辑解决方案不起作用,那么您将给出您的代码
  • 如果我是老师,OP 是我的学生,我会同意你的看法。如果我的回答违反了 SO 规则,请标记它,版主会处理它。谢谢
【解决方案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 日

“June”之后没有逗号,因为这不被认为是标准的,所以考虑一下这是否真的不是一个优势。输出将取决于语言环境设置,这也可能是一个优势。或者指定明确的语言环境,例如:

    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;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

  • 感谢您不鼓励 OP 使用已弃用的软件包。这个答案应该被接受。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2020-10-11
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多