Java 字符串datetime转换为LocalDateTime对象

Java 字符串datetime转换为LocalDateTime对象,java,jodatime,android-jodatime,Java,Jodatime,Android Jodatime,我想将此字符串转换为LocalDateTime对象。我该怎么做 “周四8月29日17:46:11格林尼治标准时间+2019年5: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 = DateT

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

“周四8月29日17:46:11格林尼治标准时间+2019年5: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)

tl;博士 仅供参考,该项目目前正在进行中,建议迁移到类。看

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

LocalDateTime
不能表示一个时刻 “2019年8月29日星期四17:46:11 GMT+05:30”

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

你不能

  • 输入代表一个时刻,时间线上的一个特定点
  • LocalDateTime
    不能表示一个时刻。
    LocalDateTime
    只有日期和时间,但缺少时区上下文或UTC偏移量
试图将您的输入作为
LocalDateTime
处理意味着丢弃有价值的信息。这就好比把一笔钱当作一个简单的
BigDecimal
来处理,同时扔掉关于哪种货币的信息

OffsetDateTime
您输入的字符串包含一个提前五个半小时的字符串。因此,将其解析为对象

使用类定义自定义格式模式以匹配输入

定义

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

提示:这种输入格式很糟糕。教育这些输入字符串的发布者实用日期时间格式的标准


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(您为解析提供的格式字符串与您实际使用的文本格式不符。您需要先解析,然后格式化。只需测试下面的代码

          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();
          }
      
      请注意,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
      链接
      • 相关问题:
      • 使用格式模式字母,包括其大小写

      是什么让你认为代码> DDD <代码>与<代码> thu<代码>匹配?你考虑读吗?哦……我读错文档。我想…谢谢你的帮助。我得到了解决方案。为什么一个代码> LoalDATeTime< /Cord>对象?(< <代码> LoalDATeTime< /代码>不执行;请考虑<代码>日期时间< /代码>)。为什么您要使用超旧的、笨重的java遗留日期API来代替现代日期时间API?OP也已经在使用jodatime。因为有人想使用经过一些修改的旧代码来代替大型库。现代日期时间库从8开始就是java的一部分。它不是外部的。您的解决方案很有效,适合Q&A bu我会清楚地将它标记为遗留解决方案。任何拥有Java 8或更新版本的人都应该使用现代API。没有任何有效的理由不使用它,除非你没有Java 8。对不起,我说的是Android
          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);