如何自定义格式化FileTime

时间:2015-10-30 00:39:29

标签: java date-formatting java-time

给定FileTime fileTime,如何以自定义方式将其格式化为字符串?

String s = fileTime.toString()仅以ISO格式提供。

String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss")
                              .format(fileTime.toInstant());

抛出UnsupportedTemporalTypeException: Unsupported field: Year

5 个答案:

答案 0 :(得分:6)

我个人发现错误消息"不支持的字段:年"误导。 真正的原因是缺少时区。需要此信息来帮助格式化程序在内部将给定的瞬间转换为人工时间表示。 解决方案:提供时区。然后支持格式化或解析Instant - 与@flo的答案形成鲜明对比。

<强>印刷:

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

<强>解析:

不幸的是,反向过程 - 解析 - 不能以相同的直接方式工作,因为java.time的格式引擎被设计为格式化程序只返回需要转换为真实的原始TemporalAccessor所需类型。例如:

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

如果要解析的输入包含时区偏移或标识符,则可以修改模式(符号x,X,z,Z,VV等)并忽略对withZone(...)的调用,并在偏移的情况 - 你真的应该忽略那个调用,否则格式化程序将不会使用输入的时区偏移量,而是使用提供的一个区域(我在自己的测试中观察到的陷阱)。

答案 1 :(得分:4)

您无法使用查询年份的DateTimeFormatter实例格式化Instant。

Instant表示时间线上的单个点。这就是为什么不能对“年/日/时间是什么?”的问题给出正确/唯一的答案。这取决于问题在世界的哪个方面:在纽约,它与西德尼不同。 但你的DateTimeFormatter正在问这个问题。这就是为什么你得到UnsupportedTemporalTypeException

您必须至少将Instance转换为LocalDateTime

System.out.println(timestampFormatter.format(
    LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault()));

答案 2 :(得分:2)

格式化Instant需要时区。这可以使用withZone(ZoneId)

来实现
String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss")
                 .withZone(ZoneId.systemDefault())
                 .format(fileTime.toInstant());

答案 3 :(得分:1)

如果您的时间看起来像这样

yyyy-MM-dd'T'HH:mm:ss

使用

lazy var managedObjectModel: NSManagedObjectModel = {

    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.

    let modelURL = NSBundle.mainBundle().URLForResource("appTest", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

答案 4 :(得分:1)

ZonedDateTime可以解析从FileTime.toString()获取的默认字符串: (在下面的代码段中提供您自己的“路径”)

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));

结果:2020年4月18日,星期六,13:43:29