Java 8 date-time parsing with optional 2-4 year components [duplicate]












0
















This question already has an answer here:




  • Java 8 DateTimeFormatter two digit year 18 parsed to 0018 instead of 2018?

    2 answers




I would like to parse LocalDate objects from various date strings. All strings already have the format dd-MM-yy or dd-MM-yyyy. In the first case the base year should be prepended with 19 instead of 20.



I have this code but I can't get it working. What am I doing wrong?



        public static LocalDate parseDateString(String date) {
DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendOptional(optionalFullYearParser)
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(new Locale ("nl","NL"));

return java.time.LocalDate.parse(date,parser);
}

System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


When I run this code it throws an Exception:




java.time.format.DateTimeParseException: Text '11-10-56' could not be parsed at index 8
...




Any help will be greatly appreciated!










share|improve this question













marked as duplicate by Ole V.V. java
Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 21 '18 at 22:10


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.














  • 1





    You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

    – Ole V.V.
    Nov 21 '18 at 22:11


















0
















This question already has an answer here:




  • Java 8 DateTimeFormatter two digit year 18 parsed to 0018 instead of 2018?

    2 answers




I would like to parse LocalDate objects from various date strings. All strings already have the format dd-MM-yy or dd-MM-yyyy. In the first case the base year should be prepended with 19 instead of 20.



I have this code but I can't get it working. What am I doing wrong?



        public static LocalDate parseDateString(String date) {
DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendOptional(optionalFullYearParser)
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(new Locale ("nl","NL"));

return java.time.LocalDate.parse(date,parser);
}

System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


When I run this code it throws an Exception:




java.time.format.DateTimeParseException: Text '11-10-56' could not be parsed at index 8
...




Any help will be greatly appreciated!










share|improve this question













marked as duplicate by Ole V.V. java
Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 21 '18 at 22:10


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.














  • 1





    You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

    – Ole V.V.
    Nov 21 '18 at 22:11
















0












0








0









This question already has an answer here:




  • Java 8 DateTimeFormatter two digit year 18 parsed to 0018 instead of 2018?

    2 answers




I would like to parse LocalDate objects from various date strings. All strings already have the format dd-MM-yy or dd-MM-yyyy. In the first case the base year should be prepended with 19 instead of 20.



I have this code but I can't get it working. What am I doing wrong?



        public static LocalDate parseDateString(String date) {
DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendOptional(optionalFullYearParser)
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(new Locale ("nl","NL"));

return java.time.LocalDate.parse(date,parser);
}

System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


When I run this code it throws an Exception:




java.time.format.DateTimeParseException: Text '11-10-56' could not be parsed at index 8
...




Any help will be greatly appreciated!










share|improve this question















This question already has an answer here:




  • Java 8 DateTimeFormatter two digit year 18 parsed to 0018 instead of 2018?

    2 answers




I would like to parse LocalDate objects from various date strings. All strings already have the format dd-MM-yy or dd-MM-yyyy. In the first case the base year should be prepended with 19 instead of 20.



I have this code but I can't get it working. What am I doing wrong?



        public static LocalDate parseDateString(String date) {
DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendOptional(optionalFullYearParser)
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(new Locale ("nl","NL"));

return java.time.LocalDate.parse(date,parser);
}

System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


When I run this code it throws an Exception:




java.time.format.DateTimeParseException: Text '11-10-56' could not be parsed at index 8
...




Any help will be greatly appreciated!





This question already has an answer here:




  • Java 8 DateTimeFormatter two digit year 18 parsed to 0018 instead of 2018?

    2 answers








java datetime java-8 java-time






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 21 '18 at 21:18









Ferry KranenburgFerry Kranenburg

1,6971119




1,6971119




marked as duplicate by Ole V.V. java
Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 21 '18 at 22:10


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.









marked as duplicate by Ole V.V. java
Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 21 '18 at 22:10


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.










  • 1





    You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

    – Ole V.V.
    Nov 21 '18 at 22:11
















  • 1





    You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

    – Ole V.V.
    Nov 21 '18 at 22:11










1




1





You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

– Ole V.V.
Nov 21 '18 at 22:11







You’re over-complicating it. See how simple it is in my answer to the linked original question. The trick is to have yyyy before yy, or it will parse the first two of the four digits as a two digit year and then get stuck.

– Ole V.V.
Nov 21 '18 at 22:11














1 Answer
1






active

oldest

votes


















2














There is no need for 2 formatter objects to do this, and you shouldn't include the year part in the pattern text when you then use appendValueReduced to add the year part.



public static LocalDate parseDateString(String date) {
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("dd-MM-")
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(Locale.forLanguageTag("nl-NL"));
return java.time.LocalDate.parse(date, parser);
}


Test



System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


Output



1956-10-11
1956-10-11
1951-05-08





share|improve this answer


























  • Thank you very much, this works!

    – Ferry Kranenburg
    Nov 21 '18 at 21:49


















1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









2














There is no need for 2 formatter objects to do this, and you shouldn't include the year part in the pattern text when you then use appendValueReduced to add the year part.



public static LocalDate parseDateString(String date) {
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("dd-MM-")
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(Locale.forLanguageTag("nl-NL"));
return java.time.LocalDate.parse(date, parser);
}


Test



System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


Output



1956-10-11
1956-10-11
1951-05-08





share|improve this answer


























  • Thank you very much, this works!

    – Ferry Kranenburg
    Nov 21 '18 at 21:49
















2














There is no need for 2 formatter objects to do this, and you shouldn't include the year part in the pattern text when you then use appendValueReduced to add the year part.



public static LocalDate parseDateString(String date) {
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("dd-MM-")
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(Locale.forLanguageTag("nl-NL"));
return java.time.LocalDate.parse(date, parser);
}


Test



System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


Output



1956-10-11
1956-10-11
1951-05-08





share|improve this answer


























  • Thank you very much, this works!

    – Ferry Kranenburg
    Nov 21 '18 at 21:49














2












2








2







There is no need for 2 formatter objects to do this, and you shouldn't include the year part in the pattern text when you then use appendValueReduced to add the year part.



public static LocalDate parseDateString(String date) {
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("dd-MM-")
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(Locale.forLanguageTag("nl-NL"));
return java.time.LocalDate.parse(date, parser);
}


Test



System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


Output



1956-10-11
1956-10-11
1951-05-08





share|improve this answer















There is no need for 2 formatter objects to do this, and you shouldn't include the year part in the pattern text when you then use appendValueReduced to add the year part.



public static LocalDate parseDateString(String date) {
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("dd-MM-")
.appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
.toFormatter(Locale.forLanguageTag("nl-NL"));
return java.time.LocalDate.parse(date, parser);
}


Test



System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());


Output



1956-10-11
1956-10-11
1951-05-08






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 21 '18 at 21:38









NiVeR

6,97041930




6,97041930










answered Nov 21 '18 at 21:32









AndreasAndreas

77.1k464124




77.1k464124













  • Thank you very much, this works!

    – Ferry Kranenburg
    Nov 21 '18 at 21:49



















  • Thank you very much, this works!

    – Ferry Kranenburg
    Nov 21 '18 at 21:49

















Thank you very much, this works!

– Ferry Kranenburg
Nov 21 '18 at 21:49





Thank you very much, this works!

– Ferry Kranenburg
Nov 21 '18 at 21:49





Popular posts from this blog

Paul Cézanne

UIScrollView CustomStickyHeader Resize height generates problems when scroll is too fast

Angular material date-picker (MatDatepicker) auto completes the date on focus out