tl;dr
OffsetDateTime
.parse(
"Wed, 20 Feb 2019 07:14:06 +0100" ,
DateTimeFormatter.RFC_1123_DATE_TIME
)
.toString()
2019-02-20T07:14:06+01:00
Details
Your problem has nothing to do with Java 8 versus Java 17.
Tip: Before blaming software that is formally specified, is thoroughly tested by enormous test suites, and is used by millions of programmers daily, suspect your own code first.
Locale
Specify a Locale. The locale determines the human language and cultural norms used in translating month names, etc.
If you do not specify a Locale, the JVM’s current default is applied implicitly. I would bet that when you ran your app at different times or on different machines, the JVM’s current default Locale varied.
Locale locale = Locale.US ;
DateTimeFormatter formatter =
DateTimeFormatter
.ofPattern( "EEE, d MMM yyyy HH:mm:ss Z" )
.withLocale( locale );
String input = "Wed, 20 Feb 2019 07:14:06 +0100" ;
ZonedDateTime zdt = ZonedDateTime.parse( input , formatter ) ;
String output = zdt.toString() ;
System.out.println( output );
See this code run at Ideone.com.
2019-02-20T07:14:06+01:00
RFC 1123
As commented by Ole V.V., your format happens to comply with the legacy standards RFC 1123, RFC 822, and RFC 2822.
The DateTimeFormatter class carries a pre-defined formatter object for that format. See the constant DateTimeFormatter.RFC_1123_DATE_TIME.
That pre-defined formatter already has the appropriate English-based locale required by the RFCs’ specifications. So no need to specify a Locale object here.
String input = "Wed, 20 Feb 2019 07:14:06 +0100" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
See this code run at Ideone.com.
2019-02-20T07:14:06+01:00
ISO 8601
Modern protocols use ISO 8601 rather than this outdated format. The java.time classes use ISO 8601 formats by default when parsing text or formatting a date-time instance.
I suggest you educate the publisher of your data about the virtues in using only ISO 8601 standard formats for communicating date-time values textually.
Answer from Basil Bourque on Stack OverflowI'm having the same problem. I found this: https://bugs.openjdk.org/browse/JDK-8297504
Basically it says in older unicode CLDR (v33) which java 11 is based on, German terms for AM/PM is nachm. and vorm.
But in CLDR v44 which java17 is based on they changed it to AM/PM.
This is the quote from the ticket(https://bugs.openjdk.org/browse/JDK-8297504):
It turned out that the change came from the upstream CLDR. In CLDR v33 which JDK 11 is based on, "pm" string is localized into German "nachm." (look for "·de·" in the right column): https://www.unicode.org/cldr/cldr-aux/charts/33/by_type/date_&_time.gregorian.html#72c7f54616968b69
whereas in CLDR v42 which the latest JDK is based on, "pm" string in German is "PM": https://unicode-org.github.io/cldr-staging/charts/latest/by_type/date_&_time.gregorian.html#72c7f54616968b69
So the current right way in German based on recent unicode is AM/PM
Creating proper datetime format with correct Chronology and Locale will give am/pm in desired locale. For Germany and Chinese, I was able to get correct data, but for Hindi and Italy it’s not giving expected output. May be this is how data is showed in their respective region.
final String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.FULL, FormatStyle.FULL, Chronology.ofLocale(Locale.GERMAN),Locale.GERMAN);
final DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern(pattern).withLocale(Locale.GERMAN);
final String value = ZonedDateTime.now().format(targetFormat);
Hi All, i am using DateTimeformatter's parsebest method to parse dateTime, it was working fine in the Java 11 but once after changing it to java 17 it throws error.
DateTimepattern: yyyy-MM-dd hh:mm:ss a
lets say format is the DateTime Object.
So now, i put the code like this,
fmt.parseBest(str, ZonedDateTime::from, LocalDateTime::from, LocalDate::from, LocalTime::from);
where str: 2020-12-01 03:01:01 PM
In java 17 it throws error like java.time.format.DateTimeParseException: Text '2020-12-01 03:01:01 PM' could not be parsed at index 20. java.time.format.DateTimeParseException: Text '2020-12-01 03:01:01 PM' could not be parsed at index 20 at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052) at java.base/java.time.format.DateTimeFormatter.parseBest(DateTimeFormatter.java:2000)
I read through oracle jdk documentation to find info regarding but no luck :( . Can anyone please let me know what's wrong here, or how do I change this behavior. Thank you for your time reading this.
You’ve not given enough info to answer directly. But here are some pointers.
java.util.Date#toString tells a lie
The toString method of Date tells a lie. While generating text to report the UTC value of the moment within the object, that method applies the JVM’s current default time zone. This creates the illusion of a time zone where actually the value has an offset of zero hours-minutes-seconds from the temporal meridian of UTC.
That class has a terrible name. It does not represent a date. It represents a moment, a point on the timeline, a date with time of day as seen from an offset of zero.
Solution: Stop using that class.
public class SampleClass
{
Integer id ;
java.time.LocalDate received ;
…
}
Avoid legacy date-time classes
You are using terribly flawed date-time classes that were years ago supplanted by the modern java.time classes defined in JSR 310.
java.time.LocalDate
when we send say "25-01-2017"
Parse as a java.time.LocalDate.
Define a custom formatting pattern to match your input.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
Parse.
LocalDate date = LocalDate.parse( "25-01-2017" , f ) ;
No time of day is involved. Your problem is eliminated.
The format is always the same. When you concatenate a Date to a String the method Date.toString() is used to convert the date:
Converts this Date object to a String of the form:
dow mon dd hh:mm:ss zzz yyyy
The difference is probably because the first date is not containing time information. Why is that we don't know because there are no details in the question of how sampleClass has been constructed or if there is a difference in the versions of other libraries.