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

Java 使用Joda时间库将日期字符串转换为DateTime对象,java,datetime,jodatime,Java,Datetime,Jodatime,我有一个日期字符串,格式如下“04/02/2011 20:27:05”。我正在使用Joda时间库,希望将其转换为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对象?您的格式不是预期的ISO格式,您应该尝

我有一个日期字符串,格式如下
“04/02/2011 20:27:05”
。我正在使用Joda时间库,希望将其转换为
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
对象?

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

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

你需要一个适合你使用的格式。查看文档,了解如何构建一个

即兴,我认为您需要
format=DateTimeFormat.forPattern(“M/d/y H:M:s”)
您也可以使用,如
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();
}

我知道这是一个老问题,但我想补充一点,从JodaTime 2.0开始,您可以使用一行代码来实现这一点:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
一个简单的方法:

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

    return dateRetour;
}

从评论中,我选择了一个答案,比如并添加了时区:

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);
tl;博士 java.time 现代方法使用java.time类来取代久负盛名的Joda time项目

解析为,因为您的输入缺少时区或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

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


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

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

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、和。

有两种方法可以实现这一点

日期时间格式

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
        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
SimpleDataFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
        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

您好,格式化程序是否可能不接受时区?当应用
toString
函数时,“zz”返回“MEZ”,但我无法从中解析:
无效格式:“31.Januar 2013 06:38:08 MEZ”在“MEZ”处格式不正确。这是一个已知的问题吗?我怎样才能避免呢?问候。@Danyel:您可以添加类似DateTimeFormat.forPattern(“yyyy-MM-dd'T'HH:MM:ss.SSS'Z')的时区。withLocale(Locale.ROOT)。With年表(ISOChronology.getInstanceUTC());我得到了一个无效的格式:“2014-11-04T17:41:52.000+01:00”在“+01:00”与以下格式化程序的格式不正确:私有静态最终日期TimeFormatter DATE\u TIME\u formatter=DateTimeFormat.forPattern(“yyyy-MM-dd'T'HH:MM:ss.SSS'ZZ'”);joda TIME 2.2上的DATE\u TIME\u FORMATTER.parseDateTime((字符串)customSoftware.get(头[3]),在删除了ZZ周围的单引号后,它开始工作。我想知道这些单引号是什么意思…@Stephaneyelbert(或任何其他人)单引号意味着字符串中预期的文字字符,而不是模式的一部分。例如:如果您的日期出于某种原因以“2015-08-dd30”的形式输入,您将指定“yyyy MM-'dd'dd”,表示第一个dd是字符串中预期的文字部分,第二个dd(撇号之外)是需要解析的实际日期。因此,在您之前的案例中,如果在传入的datetime-string的末尾添加“ZZ”而不是实际时区,那么它会起作用。在这种情况下,kirlisakal不会这样做,但不要创建SimpleDataFormat的共享实例,因为它不是线程安全的,如果您使用doFYI,则调试会是一场噩梦,这些麻烦的旧日期时间类,例如,
java.util.Calendar
java.text.SimpleDataFormat
现在被内置在Java8和Java9中的类所取代。看见与传统类不同,java.time类是线程安全的。应该是:DateTimeFormat.forPattern(“dd/MM/yyyy HH:MM:ss”).parseDateTime(“04/02/2011 20:27:05”)。如果有人来到这里,想知道如何使用java 8中的
java.time
包解析日期字符串,请尝试使用或
Instant.parse
。仅供参考,该项目现在正在进行中,团队建议迁移到课堂。看,两个都过时了。也有一种现代的方式;它在里面。此外,你没有贡献其他几个答案中没有的东西。而当要求Joda Time时,我最诚实的观点是,建议使用更长的过时且臭名昭著的SimpleDataFormat是不好的。我应该在导入部分做些什么?
        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