字符串日期时间转换为 LocalDateTime 对象

String datetime convert to LocalDateTime object

我想将此字符串转换为 LocalDateTime 对象。我该怎么做?

"Thu Aug 29 17:46:11 GMT+05:30 2019"

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

    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);

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "Thu Aug 29 17:46:11" at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) at org.joda.time.LocalDateTime.parse(LocalDateTime.java:168)

tl;博士

仅供参考,Joda-Time project is now in maintenance mode, advising migration to the java.time classes. See Tutorial by Oracle

OffsetDateTime.parse( 
    "Thu Aug 29 17:46:11 GMT+05:30 2019" , 
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US ) 
)
.toString()

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

LocalDateTime不能代表一个时刻

"Thu Aug 29 17:46:11 GMT+05:30 2019"

I want to convert to this string to LocalDateTime object.

你不能。

  • 输入代表一个时刻,时间轴上的一个特定点。
  • 一个LocalDateTime不能代表一个时刻。 LocalDateTime 只有日期和时间,但缺少时区上下文或与 UTC 的偏移量。

尝试将您的输入作为 LocalDateTime 处理意味着丢弃有价值的信息。这就像处理一笔钱一样简单 BigDecimal 而丢弃有关哪种货币的信息。

OffsetDateTime

您输入的字符串包含一个 offset-from-UTC of five and a half hours ahead. So parse as an OffsetDateTime 对象。

使用 DateTimeFormatter class.

定义自定义格式模式以匹配您的输入

定义

String input = "Thu Aug 29 17:46:11 GMT+05:30 2019" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US );
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;

odt.toString(): 2019-08-29T17:46:11+05:30

提示:该输入格式糟糕。就实用日期时间格式的标准 ISO 8601 向这些输入字符串的发布者进行培训。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

您提供的用于解析的格式字符串与您实际获得的文本格式不符。您需要先解析,然后再格式化。只需测试下面的代码,

    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();
    }

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to 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)。

链接