Reputation: 6959
Given a FileTime fileTime
, how can it be formatted in a custom way to a string?
String s = fileTime.toString()
provides it in ISO format only.
String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss")
.format(fileTime.toInstant());
throws UnsupportedTemporalTypeException: Unsupported field: Year
Upvotes: 8
Views: 2581
Reputation: 31
ZonedDateTime can parse the default string that you get from a FileTime.toString(): (supply your own 'path' in the code snippet below)
FileTime fileTime = Files.getLastModifiedTime(path);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(fileTime.toString());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, yyyy HH:mm:ss");
System.out.println(dtf.format(zonedDateTime));
Result: Saturday, April 18, 2020 13:43:29
Upvotes: 1
Reputation: 44071
Personally I find the error message "Unsupported field: Year" misleading. The real cause is missing timezone. This information is needed to help the formatter to internally convert the given instant to a human-time-representation. Solution: Supply the timezone. Then formatting or parsing an Instant
is supported - in contrast to the answer of @flo.
Printing:
String s =
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.format(Instant.now());
System.out.println(s); // 2015-Oct-30 15:22:32
Parsing:
The reverse procedure - parsing - does unfortunately not work the same direct way because the format engine of java.time
is designed such that the formatter only returns a raw TemporalAccessor
which needs to be converted to the real required type. Example:
Instant instant =
Instant.from(
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.parse("2015-Oct-30 15:22:32"));
System.out.println("=>" + instant); // 2015-10-30T14:22:32Z
If the input to be parsed contains a timezone offset or an identifier then you can modify the pattern (symbols x, X, z, Z, VV etc.) and leave out the call to withZone(...)
, and in case of offsets - you really should leave out that call because otherwise the formatter will not use the timezone offset of your input but the supplied one zone (a pitfall I observed in my own tests).
Upvotes: 6
Reputation: 63405
Formatting an Instant
requires a time-zone. This can be achieved using withZone(ZoneId)
:
String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault())
.format(fileTime.toInstant());
Upvotes: 2
Reputation: 10271
You cannot format an Instant using a DateTimeFormatter
instance querying the year.
An Instant
is representing a single point on the time line. That's why it is not possible to give a correct/unique answer to the question "what's the year/day/time?". It depends on where on the world the question is asked: In New York it differs from Sidney.
But your DateTimeFormatter is asking exactly this question. And that is why you get an UnsupportedTemporalTypeException
.
You have to convert the Instance
to a LocalDateTime
at least:
System.out.println(timestampFormatter.format(
LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault()));
Upvotes: 4
Reputation: 7415
If your time looks like this
2015-01-01T10:10:09
Use
yyyy-MM-dd'T'HH:mm:ss
Upvotes: 1