Parse Date String to Some Java Object

前端 未结 6 2195
太阳男子
太阳男子 2020-11-28 15:41

I am working in a project that reads files and processes data. There I got to work with dates for example:

  1. 2012-01-10 23:13:26
  2. January 13, 2012
  3. <
6条回答
  •  一生所求
    2020-11-28 16:02

    tl;dr

    LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
    

    …and…

    LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
    

    Details

    The Answer by Jonik is basically correct but misses some important issues.

    java.time

    If there are any thing better than Joda out there, please let me know it as well.

    Yes, there is something better, the java.time framework. The Joda-Time team advises migration to java.time as its successor.

    The java.time framework is built into Java 8 and later. These classes supplant the old troublesome date-time classes such as java.util.Date, .Calendar, & java.text.SimpleDateFormat.

    To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations.

    Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

    Date-time

    Your first input is a date plus a time-of-day. It lacks any offset-from-UTC or time zone info, so we parse it as a LocalDateTime object. The “Local…” means any locality, no specific locality. So it is not an actual moment on the timeline but rather just a rough idea about a moment.

    To parse the input string 2012-01-10 23:13:26 we can replace the SPACE in the middle with a T to conform with the canonical style for the ISO 8601 standard format of date-time values.

    The java.time classes use ISO 8601 formats by default when parsing and generating textual representations of date-time values. So no need to define a parsing pattern.

    String input = "2012-01-10 23:13:26".replace( " " , "T" );
    LocalDateTime ldt = LocalDateTime.parse( input );
    

    If you know the the intended time zone from the context of this value, apply it to define an actual moment on the timeline.

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = ldt.atZone( zoneId );
    

    Dump to console.

    System.out.println ( "input: " + input + " | zdt: " + zdt );
    

    input: 2012-01-10T23:13:26 | zdt: 2012-01-10T23:13:26-05:00[America/Montreal]

    Date-only

    The second of you inputs is a date-only value without time-of-day and without time zone. For that we need the LocalDate class.

    I recognize the format of that input as complying with the language (English) and cultural norms of the United States. So no need to specify explicitly a formatting pattern. We can simply ask for a formatter that knows that US format by specifying a Locale. We specify FormatStyle.LONG as appropriate for the length of this format.

    String input = "January 13, 2012";
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
    LocalDate localDate = LocalDate.parse ( input , formatter );
    

    Dump to console.

    System.out.println ( "input: " + input + " | localDate: " + localDate );
    

    input: January 13, 2012 | localDate: 2012-01-13

提交回复
热议问题