I created this wonderful static method yesterday, and it worked just fine - yesterday
However, today it gives me this error. I guess it is from too many 0s before the Z.
Can anyone recommend how to parse in a concise way (Java 8) this type of String
format date - keeping in mind that it worked yesterday too, so ISO_INSTANT
is also a valid format for the String
?
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
at java.time.LocalDate.from(LocalDate.java:368)
at java.time.LocalDateTime.from(LocalDateTime.java:456)
... 9 more
throwing an exception on input time: "2015-09-28T14:46:44.000000Z"
/**
*
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z" )
* @return
*/
public static LocalDateTime parseTimeINSTANT(String time) {
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT;
return LocalDateTime.from(f.parse(time));
}
You are parsing a String that is consistent with an ISO instant so you need to store the result in a Instant
instead of LocalDateTime
:
public static Instant parseTimeINSTANT(String time) {
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT;
return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from);
}
Note that this formatter handles correctly fractional seconds so you don't need to remove them. Quoting DateTimeFormatter.ISO_INSTANT
Javadoc (emphasis mine):
When parsing, time to at least the seconds field is required. Fractional seconds from zero to nine are parsed .
As to why it worked yesterday and not today, I have no idea...
Just for the sake of helping anyone seeing this question later.
You need to parse the ISO Date as Instant
, convert it to Instant
Object and then create a LocalDateTime
from it providing the zone Id. I'm setting the zone Id of UTC here.
The code is as follows
public static LocalDateTime getISODate(String dateString) {
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT;
Instant dateInstant = Instant.from(isoFormatter.parse(dateString));
LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId()));
return date;
}
ISO_INSTANT does not have zone info. Just add that. Or use DateTimeFormatter.ISO_ZONED_DATE_TIME instead
import java.time.*;
import java.time.format.*;
public class TestMain {
DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.of("Z"));
DateTimeFormatter formatter2 = DateTimeFormatter.ISO_ZONED_DATE_TIME
public static void main(String[] args) {
ZonedDateTime.parse("2031-12-01T10:58:30Z", formatter);
ZonedDateTime.parse("2031-12-01T10:58:30Z", formatter2);
}
}
DateTimeFormatter
Parse your ISO 8601 compliant Date-Time string directly into an Instant
using Instant#parse
. The modern Date-Time API is based on ISO 8601 and does not require using a DateTimeFormatter
object explicitly as long as the Date-Time string conforms to the ISO 8601 standards.
Demo:
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.parse("2015-09-28T14:46:44.000000Z");
System.out.println(instant);
}
}
Output:
2015-09-28T14:46:44Z
Instant
can be converted to other java.time
types eg
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.parse("2015-09-28T14:46:44.000000Z");
System.out.println(instant);
LocalDateTime ldt = instant.atZone(ZoneOffset.UTC).toLocalDateTime();
System.out.println(ldt);
}
}
Output:
2015-09-28T14:46:44Z
2015-09-28T14:46:44
Learn more about the modern Date-Time API from Trail: Date Time .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.