I am trying to parse three numbers, like [2, 10, 2014]
to a LocalDate
using the new Java 8 Date and Time API.
All sounds relatively easy, right? Well, perhaps not.
The additional constraint is that I need to take into account the locale, as for example Dutch and American use different date formatting.
The only input I have are the three numbers and the locale, and the output should be a well-formed date, in the form of a LocalDate
.
I have figuring that I will be needing the following steps:
Locale
that can read in three numbers.LocalDate
.I have looked around a bit, especially in the DateTimeFormatter
class, but it seems to want to have the day, month and year formats explicitely passed in, which is not an option for me.
How would I convert three numbers (representing the day, month and year in any order) in a LocalDate
?
Examples:
Dutch format:
Locale locale = new Locale("nl");
List<String> inputs = Arrays.asList("2", "10", "2014");
//output should equal
LocalDate.of(2014, 10, 2);
American format:
Locale locale = Locale.ENGLISH;
List<String> inputs = Arrays.asList("10", "2", "2014");
//output should equal
LocalDate.of(2014, 10, 2);
Also keep in mind that I am talking about the concept of numbers, but they need to be represented as Strings to also accommodate languages that use other Unicode characters than the digits 0-9 for their numbers.
out. println(today); //Custom pattern is yyyy/MM/dd DateTimeFormatter formatter = DateTimeFormatter. ofPattern("dd-MMM-yyyy"); LocalDate date = LocalDate. parse("29-Mar-2019", formatter); System.
Parsing date and time To create a LocalDateTime object from a string you can use the static LocalDateTime. parse() method. It takes a string and a DateTimeFormatter as parameter. The DateTimeFormatter is used to specify the date/time pattern.
To format the localdate in any other custom pattern, we must use LocalDate. format(DateTimeFormatter) method. LocalDate today = LocalDate. now(); String formattedDate = today.
First create a strings from numbers and then you can use something like
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.util.Locale;
public class IntegerDateTest {
public static void main(String args[]) {
int[][] dates = {{10, 02, 2014}, {02, 10, 2014}, {2014, 10, 02}};
Locale[] locales = {Locale.ENGLISH, Locale.FRENCH, Locale.JAPANESE};
for (int i = 0; i < 3; i++) {
int[] dateParts = dates[i];
Locale locale = locales[i];
String date = String.format("%02d/%02d/%02d", dateParts[0] % 100,
dateParts[1] % 100, dateParts[2] % 100);
System.out.printf("Locale : %s, Str Date : %s,", locale, date);
DateTimeFormatter df = new DateTimeFormatterBuilder().append(
DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT))
.toFormatter(locale);
System.out.printf(" Parsed Date : %s\n",LocalDate.from(df.parse(date)));
}
}
}
Locale : en, Str Date : 10/02/14, Parsed Date : 2014-10-02 Locale : fr, Str Date : 02/10/14, Parsed Date : 2014-10-02 Locale : ja, Str Date : 14/10/02, Parsed Date : 2014-10-02
You can first retrieve the pattern relate with particular locale and then access the elements according to it. You can retrieve the pattern associated with particular locale using simpleDateFormat.toPattern()
Here is a sample code
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class T {
public static void main(String[] args) throws ParseException {
Locale enLocale = Locale.ENGLISH;
Locale nlLocale = new Locale("nl");
List<String> enInput = Arrays.asList("10", "2", "2014");
List<String> nlInput = Arrays.asList("2", "10", "2014");
Map<String, Integer> enPositionMap = getPositionMap(enLocale, enInput);
Map<String, Integer> nlPositionMap = getPositionMap(nlLocale, nlInput);
System.out.println("EN date " + LocalDate.of(enPositionMap.get("y"), enPositionMap.get("m"), enPositionMap.get("d")));
System.out.println("NL date " + LocalDate.of(nlPositionMap.get("y"), nlPositionMap.get("m"), nlPositionMap.get("d")));
}
public static Map<String, Integer> getPositionMap(Locale locale, List<String> input) {
final DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT, locale);
Map<String, Integer> map = new HashMap<>();
if (dateInstance instanceof SimpleDateFormat) {
String pattern = ((SimpleDateFormat) dateInstance).toPattern();
String separator = String.valueOf(pattern.charAt(1));
String[] chunks = pattern.split(separator);
for (int i = 0; i < chunks.length; i++) {
switch (chunks[i]) {
case "M":
map.put("m", Integer.parseInt(input.get(i)));
break;
case "d":
map.put("d", Integer.parseInt(input.get(i)));
break;
case "yy":
map.put("y", Integer.parseInt(input.get(i)));
break;
}
}
}
return map;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With