将日期字符串解析为某个Java对象

将日期字符串解析为某个Java对象,java,datetime,jodatime,date-parsing,Java,Datetime,Jodatime,Date Parsing,我在一个读取文件和处理数据的项目中工作。在那里,我开始处理日期问题,例如: 2012-01-10 23:13:26 2012年1月13日 我找到了乔达的包裹,有点有趣,但不知道这是不是最简单的包裹 我能够将第一个示例解析为DateTime对象(Joda)reg ex和字符串操作。(例如:用“-”替换空格并将其传递给构造函数 new DateTime("2012-01-10 23:13:26".replace(' ', '-')) 我想这是可行的,但问题在于第二种格式。我如何使用这样的输入来提取

我在一个读取文件和处理数据的项目中工作。在那里,我开始处理日期问题,例如:

  • 2012-01-10 23:13:26
  • 2012年1月13日
  • 我找到了乔达的包裹,有点有趣,但不知道这是不是最简单的包裹

    我能够将第一个示例解析为DateTime对象(Joda)reg ex和字符串操作。(例如:用“-”替换空格并将其传递给构造函数

    new DateTime("2012-01-10 23:13:26".replace(' ', '-'))
    
    我想这是可行的,但问题在于第二种格式。我如何使用这样的输入来提取对象,最好是Joda对象。我当然可以编写一个函数来将格式更改为Joda支持的格式,但我想知道是否有其他方法(甚至是一些本机Java库)来实现这一点

    如果有比乔达更好的东西,也请告诉我


    谢谢。

    SimpleDataFormat将把日期解析为Java日期对象:


    JodaTime在很大程度上被认为是Java中日期时间处理的事实标准——他们正在努力将其添加到Java库的下一个版本中(很好,很有效)


    要从字符串中获取JodaTime日期,您需要查看类。

    我可以想象Joda有一个格式化程序来为您执行此操作。我通过快速谷歌搜索找到了此功能:

    DateTimeFormatter解析器1=
    模式的日期时间格式(“dd/MMM/yyyy:HH:mm:ss Z”);
    日期时间格式分析器2=
    DateTimeFormat.forPattern(“yyyy-MM-dd-HH:MM”);
    DateTime time=parser1.parseDateTime(“”);
    

    用于评估模式的语法可以在中找到。

    使用Joda Time,请查看;它允许解析您提到的两种日期字符串(以及几乎任何其他任意格式)。如果您的需要更复杂,请尝试

    要分析#1:

    编辑:实际上是不带时区的日期时间的更合适的类型:

    LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");
    
    对于#2:

    是的,就Java日期和时间处理而言,Joda Time无疑是一条必经之路

    大多数人都会同意,Joda是一个非常用户友好的图书馆。例如,我以前从未使用Joda进行过这种解析,但我只花了几分钟就从API中找到了它并编写了它

    更新(2015年) 如果您使用的是Java8,在大多数情况下,您只需使用,而不是使用Joda Time。它包含了几乎所有的好东西或乔达的等价物。对于那些已经熟悉Joda API的人来说,Stephen Colebourne的API会派上用场

    下面是上述示例的java.time版本

    要分析#1:

    您无法将其解析为ZonedDateTime或OffsetDateTime(这是Joda的DateTime的对应项,在我的原始答案中使用),但这有点道理,因为解析的字符串中没有时区信息

    要分析#2:


    在这里,LocalDate是最适合解析的类型(就像Joda Time一样)。

    最简单的方法是按照您期望的格式正确设置SimpleDateFormat,并使用其解析方法为您提供一个日期对象

    tl;博士 ……还有

    LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
    
    细节 基本正确,但遗漏了一些重要问题

    java.time 如果有比乔达更好的东西,也请告诉我

    是的,还有更好的,框架。Joda Time团队建议迁移到java.Time作为其继承者

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

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

    大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android

    日期时间 您的第一个输入是日期加上一天中的时间。它缺少任何或信息,因此我们将其解析为对象。“本地…”是指任何地方,而不是特定的地方。因此,这不是时间表上的一个实际时刻,而是一个关于某个时刻的粗略概念

    < P>解析输入字符串<代码> 2012-01-10:23:13:26<代码>,我们可以用“<代码> t>代码>替换中间的空间,以符合日期时间值标准格式的规范样式。 在解析和生成日期时间值的文本表示时,java.time类默认使用ISO 8601格式。因此,无需定义解析模式

    String input = "2012-01-10 23:13:26".replace( " " , "T" );
    LocalDateTime ldt = LocalDateTime.parse( input );
    
    如果您从该值的上下文中知道预期时区,请应用它来定义时间线上的实际时刻

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = ldt.atZone( zoneId );
    
    转储到控制台

    System.out.println ( "input: " + input + " | zdt: " + zdt );
    
    System.out.println ( "input: " + input + " | localDate: " + localDate );
    
    输入:2012-01-10T23:13:26 | zdt:2012-01-10T23:13:26-05:00[美国/蒙特利尔]

    仅日期 第二个输入是一个仅日期的值,不包含一天中的时间和时区。为此,我们需要上课

    我认为输入的格式符合美国的语言(英语)和文化规范。因此,无需显式指定格式化模式。我们可以简单地通过指定。我们根据此格式的长度进行适当的指定

    String input = "January 13, 2012";
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
    LocalDate localDate = LocalDate.parse ( input , formatter );
    
    转储到控制台

    System.out.println ( "input: " + input + " | zdt: " + zdt );
    
    System.out.println ( "input: " + input + " | localDate: " + localDate );
    
    输入:2012年1月13日|本地日期:2012-01-13


    对于使用非英语语言环境但解析美国日期的用户,
    format=format.withLocale(Locale.US)
    否则,一月的解析将失败//乔达·纽比太好了,谢谢你的快速信息。我可能会花上几天甚至几周的时间来解决问题。谢谢大家的帮助!回答正确,但缺少两件事。[a] 第一条注释中解释的区域设置。[b] 时区。如果省略,JVM的当前默认时区将分配给DateTime对象。最好明确说明数据源想要的时区。对格式化程序对象调用
    withZone
    ,传递的结果
    String input = "2012-01-10 23:13:26".replace( " " , "T" );
    LocalDateTime ldt = LocalDateTime.parse( input );
    
    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = ldt.atZone( zoneId );
    
    System.out.println ( "input: " + input + " | zdt: " + zdt );
    
    String input = "January 13, 2012";
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
    LocalDate localDate = LocalDate.parse ( input , formatter );
    
    System.out.println ( "input: " + input + " | localDate: " + localDate );