【问题标题】:File lastModified() returns Wed Dec 31 19:00:00 EST 1969文件 lastModified() 返回 1969 年 12 月 31 日星期三 19:00:00 EST
【发布时间】:2014-05-02 16:56:14
【问题描述】:

我正在对这样的文件进行一些测试:

    public Date findFileDate(){
    File file = new File(filePath);
    Date date = new Date(file.lastModified());
    return date;
}

当我打印 date 时,它会显示:Wed Dec 31 19:00:00 EST 1969。经过一些研究,根据我的时区,我发现这是我的“自 Unix 纪元以来的时间”,但我很困惑为什么当我的filePath 不存在文件时我会得到这个输出。为什么不返回null0

【问题讨论】:

  • 正在返回 0... Unix 纪元发生在 1969 年 12 月 31 日美国东部标准时间晚上 7 点。

标签: java time file-io java-time


【解决方案1】:

不,file.lastModified() 返回 0。那是 Unix 纪元

在您的特定时区(从外观上看是美国东部),Unix 纪元的当地时间比 UTC 晚 5 小时,因此是 1969 年 12 月 31 日晚上 7 点。

要确认这一点,只需将您的 Date 声明和分配分成两部分:

long lastModifiedMillis = file.lastModified();
Date date = new Date(lastModifiedMillis);

现在,如果您检查 lastModifiedMillis,我相信您会发现值 0,如 documented

退货
long 值表示文件上次修改的时间,以自纪元(格林威治标准时间 00:00:00,1970 年 1 月 1 日)以来的毫秒数为单位,或者 0L,如果文件不存在或 I/O发生错误

【讨论】:

  • 谢谢我使用的是 Date() 而不是我想要的 long
【解决方案2】:

java.time

java.util.Date 对象不是像modern date-time types 这样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即January 1, 1970, 00:00:00 GMT(或 UTC)。当你打印一个java.util.Date 的对象时,它的toString 方法会返回JVM 时区中的日期时间,根据这个毫秒值计算得出。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat 并从中获取格式化字符串。

请注意,旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

使用 java.time 的演示,现代日期时间 API:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String args[]) {
        Instant instant = Instant.ofEpochMilli(0);
        System.out.println(instant);

        // If you need the corresponding date-time representing your timezone
        ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.of("America/New_York"));
        System.out.println(zdt);
    }
}

输出:

1970-01-01T00:00:00Z
1969-12-31T19:00-05:00[America/New_York]

Instant 代表时间线上的一个瞬时点。输出中的 Z 代表 Zulu,它代表 UTC(+00:00 小时的时区偏移量)。

Trail: Date Time 了解有关 modern date-time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多