使用Joda Time库将日期字符串转换为DateTime对象

Tom*_*Tom 240 java datetime jodatime

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

DateTime dt = new DateTime("04/02/2011 20:27:05")
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"
Run Code Online (Sandbox Code Playgroud)

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

Boz*_*zho 462

用途DateTimeFormat:

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

  • 嗨,格式化板是否可能不接受时区?"zz"在应用`toString`函数时返回"MEZ",但是我无法解析它:`格式无效:"31.Januar 2013 06:38:08 MEZ"格式错误为"MEZ"`.这是一个已知的问题?我怎么能避免呢?问候. (2认同)
  • @Danyel:您可以添加类似DateTimeFormat.forPattern的时区("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withLocale(Locale.ROOT).withChronology(ISOChronology.getInstanceUTC()) ; (2认同)
  • 我得到一个无效的格式:"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])) (2认同)
  • 删除ZZ周围的单引号后,它可以工作.我想知道这些单引号是什么意思...... (2认同)
  • @StephaneEybert(或其他任何人)单引号意味着某些东西是字符串中预期的文字字符,并且不被视为该模式的一部分.例如:如果您的日期由于某种原因以"2015-08-dd30"出现,您将指定"yyyy-MM-'dd'dd",表示第一个dd是字符串中预期的文字部分,并且第二个dd(撇号之外)是需要解析的实际日期.因此,在您之前的情况下,如果不是实际的时区,您可以将"ZZ"放在传入的datetime-string的末尾. (2认同)

ste*_*son 62

我知道这是一个老问题,但我想补充一点,就像JodaTime 2.0一样,你可以用一个单行代码来做到这一点:

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

  • 我应该在导入部分放什么? (3认同)

Sha*_*der 20

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

  • 应该是:DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05") (7认同)

Ali*_*aca 16

从评论我选择了一个答案,并添加了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);
Run Code Online (Sandbox Code Playgroud)


Kar*_*Øie 13

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

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


efi*_*rat 5

您还可以使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,kirlisakal不会,但是不要创建SimpleDateFormat的共享实例,因为它不是线程安全的,如果您这样做,则是调试的噩梦 (3认同)
  • 仅供参考,麻烦的旧日期时间类,例如[`java.util.Date`](https://docs.oracle.com/javase/9​​/docs/api/java/util/Date.html),`java .util.Calendar和Java.text.SimpleDateFormat现在是[旧版](https://en.wikipedia.org/wiki/Legacy_system),由[java.time](https:// docs。 Java 8和Java 9中内置的oracle.com/javase/9​​/docs/api/java/time/package-summary.html)类。请参见[Oracle教程](https://docs.oracle.com/javase/教程/日期时间/TOC.html)。而且java.time类是线程安全的,这与传统类不同。 (2认同)