2

我想将此字符串转换为LocalDateTime对象。我怎样才能做到这一点?

“2019 年 8 月 29 日星期四 17:46:11 GMT+05:30”

我已经尝试了一些东西,但是没有用。

    final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
    final String format = "ddd MMM DD HH:mm:ss 'GMT'Z YYYY";

    DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format);
    LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter);

线程“主”java.lang.IllegalArgumentException 中的异常:格式无效:org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) 的“Thu Aug 29 17:46:11”在 org.joda.time .LocalDateTime.parse(LocalDateTime.java:168)

4

3 回答 3

4
于 2019-08-30T04:11:57.433 回答
3

请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到java.time(JSR-310)。

这是从 Joda-Time 主页引用的。我应该说它赞同 Basil Bourque 的回答。无论如何,如果您现在坚持坚持使用 Joda-Time,答案是:

    final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
    final String format = "EEE MMM dd HH:mm:ss 'GMT'ZZ YYYY";

    DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format)
            .withLocale(Locale.ENGLISH)
            .withOffsetParsed();
    DateTime dateTime = DateTime.parse(time, dateTimeFormatter);
    System.out.println(dateTime);

输出:

2019-08-29T17:46:11.000+05:30

  • 在格式模式字符串中
    • 你需要EEE一周中的一天。d是一个月中的一天。
    • 您需要小写dd月份的日期;大写DD是一年中的一天
    • 我已经输入了,ZZ因为根据文档,这是用冒号偏移的;Z在实践中也有效
  • 由于 Thu 和 Aug 是英语,因此您需要一个说英语的语言环境。因为我相信你的字符串来自Date.toString()最初,它总是产生英语,所以我觉得Locale.ROOT合适。
  • 我发现解析成DateTIme. 为了保留字符串的偏移量,我们需要指定它withOffsetParsed()(如果需要,您可以随时转换为LocalDateTime以后)。

链接

于 2019-08-30T11:16:16.073 回答
1

您为解析提供的格式字符串与您实际获得的文本格式看起来不正确。你需要先解析,然后格式化。只需测试以下代码,

    SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.getDefault());
    Date dt = null;
    try {
        dt = format.parse("Thu Aug 29 17:46:11 GMT+05:30 2019");
        SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a");
        String output = out.format(dt);
        Log.e("OUTPUT",output);
    } catch (Exception e) {
        e.printStackTrace();
    }
于 2019-08-30T06:09:24.487 回答