Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm trying to take two strings and make it into a Date object. I'm having trouble trying to work out what formats I need to use.

The first string is a date and is in the format of : 5th Jan

The second string is a time and is in the format of : 8:15

The main issue is what the format would be for the 5th

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
145 views
Welcome To Ask or Share your Answers For Others

1 Answer

Since your date string, 5th Jan doesn't have a year, you will have to use some default year e.g. the current year, which you can get from LocalDate.now(). You can put defaults using DateTimeFormatterBuilder#parseDefaulting. Additionally, you can also make the parser case-insensitive by using DateTimeFormatterBuilder#parseCaseInsensitive.

In order to parse a date string, 5th Jan, you can use the pattern, d'th' MMM. However, in order to deal with other suffixes like in 3rd, 1st etc., you should use the pattern, d['th']['st']['rd']['nd'] MMM where the patterns inside the square bracket are optional.

In order to parse a time string like 8:15, you can use the pattern, H:m.

Demo:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        DateTimeFormatter dtfForDate = new DateTimeFormatterBuilder()
                                        .parseCaseInsensitive()
                                        .parseDefaulting(ChronoField.YEAR, date.getYear())
                                        .appendPattern("d['th']['st']['rd']['nd'] MMM")
                                        .toFormatter(Locale.ENGLISH);

        DateTimeFormatter dtfForTime = DateTimeFormatter.ofPattern("H:m", Locale.ENGLISH);

        String strDate = "5th Jan";
        String strTime = "8:15";

        LocalDateTime ldt = LocalDate.parse(strDate, dtfForDate)
                                        .atTime(LocalTime.parse(strTime, dtfForTime));

        // Print the default string value i.e. the value returned by ldt.toString()
        System.out.println(ldt);

        // The default format omits seconds and fraction of second if they are 0. In
        // order to retain them in the output string, you can use DateTimeFormatter
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
        String formatted = dtf.format(ldt);
        System.out.println(formatted);
    }
}

Output:

2021-01-05T08:15
2021-01-05T08:15:00

Learn about the modern date-time API from Trail: Date Time.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...