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


246

我有以下格式的日期作为字符串"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对象?


2
对于到达这里寻求使用java.timeJava 8中的包解析日期字符串的任何人,请尝试使用LocalDateTime.parseInstant.parse
heenenee '16

1
仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。请参见Oracle教程
罗勒·布尔克

Answers:


477

用途DateTimeFormat

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

2
嗨,格式化程序是否可能不接受时区?应用toString功能时,“ zz”返回“ MEZ”,但我无法从中解析:Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ"。这是一个已知的问题?如何避免呢?问候。
Danyel

2
@Danyel:您可以添加类似DateTimeFormat.forPattern(“ yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”)的时区。withLocale(Locale.ROOT).withChronology(ISOChronology.getInstanceUTC()) ;
Hyque 2013年

2
我得到的格式无效:“ 2014-11-04T17:41:52.000 + 01:00”在以下格式下的格式为“ +01:00”:私人静态最终DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern(“ yyyy-MM- dd'T'HH:mm:ss.SSS'ZZ'“); DATE_TIME_FORMATTER.parseDateTime((String)customSoftware.get(header [3]))on joda-time 2.2
Stephane

2
在除去ZZ周围的单引号后,它起作用了。我想知道这些单引号是什么意思……
Stephane 2014年

2
@StephaneEybert(或其他任何人)单引号表示某物是字符串中应有的文字字符,而不应视为该模式的一部分。例如:如果您的日期由于某种原因以“ 2015-08-dd30”的形式出现,则应指定“ yyyy-MM-'dd'dd”,表示第一个dd是字符串中应有的文字部分,而第二个dd(撇号之外)是需要解析的实际日期。因此,在较早的情况下,如果在输入的datetime字符串的末尾放置“ ZZ”而不是实际的时区,则可以使用。
SadBunny

62

我知道这是一个古老的问题,但是我想补充一点,从JodaTime 2.0开始,您可以使用单行代码执行此操作:

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

3
我应该在导入部分添加什么?
德米特里(Dmitry)

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

7
应该是:DateTimeFormat.forPattern(“ dd / MM / yyyy HH:mm:ss”)。parseDateTime(“ 2011
4

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

13

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

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

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

3
在这种情况下,kirlisakal不会这样做,但是请不要创建SimpleDateFormat的共享实例,因为它不是线程安全的,如果要调试,这将是一场噩梦
dannrob

2
仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8的Java 9.请参见类由Oracle教程。而且,java.time类是线程安全的,这与传统类不同。
罗勒·布尔克

3

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

袖套,我认为您需要 format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

tl; dr

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

java.time

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

LocalDateTime由于您的输入缺少任何时区或从UTC偏移的指示,因此解析为a 。

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和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

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

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


2

一个简单的方法:

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

    return dateRetour;
}

0

两种方法可以实现

DateTimeFormat

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

两者均已过时。也有一种现代的方式。它在蓬蒿布尔克答案。另外,您不会提供其他几个答案中没有的任何内容。当我要乔达·时代(Joda-Time)时,以我最诚实的观点暗示,即使是过时且臭名昭著的麻烦SimpleDateFormat也很糟糕
Ole VV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.