【问题标题】:Converting a date string to a DateTime object using Joda Time library使用 Joda Time 库将日期字符串转换为 DateTime 对象
【发布时间】:2011-09-09 07:24:26
【问题描述】:

我有一个日期字符串,格式如下"04/02/2011 20:27:05"。我正在使用 Joda-Time 库并希望将其转换为 DateTime 对象。我做到了:

DateTime dt = new DateTime("04/02/2011 20:27:05")

但我收到以下错误:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

如何将上述日期转换为DateTime 对象?

【问题讨论】:

标签: java datetime jodatime


【解决方案1】:

使用DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

【讨论】:

  • 嗨,格式化程序是否可能不接受时区?应用toString 函数时,“zz”返回“MEZ”,但我无法从中解析:Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ"。这是一个已知的问题?我怎样才能避免它?问候。
  • @Danyel:您可以像这样添加时区 DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") .withLocale(Locale.ROOT) 。 withChronology(ISOChronology.getInstanceUTC());
  • 我得到一个无效的格式:“2014-11-04T17:41:52.000+01:00”在“+01:00”格式错误,格式如下:private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat .forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'ZZ'"); joda-time 2.2 上的 DATE_TIME_FORMATTER.parseDateTime((String) customSoftware.get(header[3]))
  • 删除 ZZ 周围的单引号后,它起作用了。我想知道这些单引号是什么意思...
  • @StephaneEybert(或其他任何人) 单引号表示某些内容是字符串中预期的文字字符,不应被视为模式的一部分。例如:如果由于某种原因您的日期为“2015-08-dd30”,您将指定“yyyy-MM-'dd'dd”,表示第一个 dd 是字符串中预期的文字部分,并且第二个 dd (撇号之外)是需要解析的实际日期。因此,在您之前的情况下,如果您将“ZZ”放在传入的日期时间字符串的末尾而不是实际时区,它会起作用。
【解决方案2】:

我知道这是一个老问题,但我想补充一点,从 JodaTime 2.0 开始,你可以用单线做到这一点:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

【讨论】:

  • 我应该在导入部分放什么?
【解决方案3】:
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

【讨论】:

  • 应该是:DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05")
【解决方案4】:

我从 cmets 中选择了一个类似的答案并添加了 TimeZone:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

【讨论】:

    【解决方案5】:

    您的格式不是预期的 ISO 格式,您应该尝试

    DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
    DateTime time = format.parseDateTime("04/02/2011 20:27:05");
    

    【讨论】:

      【解决方案6】:

      您也可以使用SimpleDateFormat,如DateTimeFormat

      Date startDate = null;
      Date endDate = null;
      try {
          if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
          if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
      } catch (ParseException e) {
          e.printStackTrace();
      }
      

      【讨论】:

      • kirlisakal 在这种情况下不会,但不要创建 SimpleDateFormat 的共享实例,因为它不是线程安全的,如果这样做,调试将是一场噩梦
      • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle。与传统类不同,java.time 类是线程安全的。
      【解决方案7】:

      tl;博士

      java.time.LocalDateTime.parse( 
          "04/02/2011 20:27:05" , 
          DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
      )
      

      java.time

      现代方法使用 java.time 类来取代古老的 Joda-Time 项目。

      解析为 LocalDateTime,因为您的输入缺少任何时区指示符或与 UTC 的偏移量。

      String input = "04/02/2011 20:27:05" ;
      DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
      LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
      

      ldt.toString(): 2011-02-04T20:27:05

      提示:在将日期时间值交换为文本而不是此处显示的格式时,请尽可能使用标准 ISO 8601 格式。方便的是,java.time 类在解析/生成字符串时使用标准格式。


      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        【解决方案8】:

        您需要一个适合您使用的格式的DateTimeFormatter。查看文档以获取有关如何构建的说明。

        即兴发挥,我想你需要format = DateTimeFormat.forPattern("M/d/y H:m:s")

        【讨论】:

          【解决方案9】:

          一个简单的方法:

          public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
              DateTime dateRetour;
              dateRetour = session.createDateTime(dateParam);                 
          
              return dateRetour;
          }
          

          【讨论】:

            【解决方案10】:

            两种方法可以实现

            日期时间格式

            DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
            

            SimpleDateFormat

                    String dateValue = "04/02/2011 20:27:05";
                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05
            
                    Date date = sdf.parse(dateValue); // returns date object
                    System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011
            

            【讨论】:

            • 两者都过时了。还有一种现代方式;它在the answer by Basil Bourque。此外,您没有贡献其他几个答案中没有的任何内容。当被要求使用 Joda-Time 时,在我最诚实的意见中,建议使用更长时间且臭名昭著的麻烦 SimpleDateFormat糟糕
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-16
            • 1970-01-01
            • 2012-07-19
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            相关资源
            最近更新 更多