【问题标题】:String datetime convert to LocalDateTime object字符串日期时间转换为 LocalDateTime 对象
【发布时间】:2020-01-03 06:11:04
【问题描述】:

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

【问题讨论】:

  • 是什么让您认为ddd 会匹配Thu?您是否考虑阅读docs
  • 哦……我认为我读错了文档……感谢您的帮助。我得到了解决方案。
  • 为什么是LocalDateTime 对象?大多数情况下,最好保留字符串中的 GMT 偏移量(LocalDateTime 不这样做;考虑DateTime)。

标签: java jodatime android-jodatime


【解决方案1】:

tl;博士

仅供参考,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-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

【讨论】:

    【解决方案2】:

    请注意,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)。

    链接

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 为什么要使用 java 的超级旧的、繁琐的遗留日期 API 而不是现代的日期时间 API? OP 也已经在使用 jodatime。
      • 因为有人想使用旧代码进行一些修改,而不是使用大型库。
      • 现代日期时间库是 Java 8 的一部分。它不是外部的。您的解决方案有效并且适合问答,但我会明确将其标记为旧解决方案。任何拥有 Java 8 或更高版本的人都应该使用现代 API。没有正当理由不使用它,除非您没有 Java 8。
      • 抱歉,我说的是安卓
      猜你喜欢
      • 2014-12-13
      • 2023-04-09
      • 1970-01-01
      • 2012-03-15
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多