字符串datetime转换为LocalDateTime对象

时间:2019-08-30 00:29:19

标签: java jodatime android-jodatime

我想将此字符串转换为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);
  

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

3 个答案:

答案 0 :(得分:4)

tl; dr

仅供参考,Joda-Time项目现在位于maintenance mode中,建议迁移到java.time类。参见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不能代表片刻

  

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

     

我想将此字符串转换为LocalDateTime对象。

您不能。

  • 输入代表一个时刻,即时间轴上的特定点。
  • LocalDateTime不能代表片刻。 LocalDateTime仅具有日期和时间,但是缺少时区或从UTC偏移的上下文。

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

OffsetDateTime

您输入的字符串包括提前五个半小时的offset-from-UTC。因此,解析为OffsetDateTime对象。

使用DateTimeFormatter类定义自定义格式设置样式以匹配您的输入。

定义

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框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

答案 1 :(得分:3)

  

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

此引用来自Joda-Time主页。我应该说,它赞同巴西尔·布尔克的回答。无论如何,如果您现在坚持使用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

  • 在格式模式字符串中
    • 一周中的某天您需要EEEd是每月的一天。
    • 您需要在每月的某天使用小写字母dd;大写字母DD用于一年中的某天
    • 我输入了ZZ,因为根据文档,这是用冒号代替的; Z在实践中也可以
  • 由于Thu和Aug是英语,因此您需要使用英语的语言环境。由于我认为您的字符串最初来自Date.toString(),并且始终会产生英语,因此我认为Locale.ROOT是合适的。
  • 我发现将其解析为DateTIme更好。为了保留字符串的偏移量,我们需要通过withOffsetParsed()指定该偏移量(如果需要,您以后随时可以转换为LocalDateTime)。

链接

答案 2 :(得分: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();
    }