1

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

    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

4

2 回答 2

6

不,file.lastModified()返回 0。那是 Unix 时代

在您的特定时区(从外观上看是美国东部),Unix 时代的本地时间比 UTC 晚 5 小时,所以它是 1969 年 12 月 31 日晚上 7 点。

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

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

现在,如果您检查lastModifiedMillis,我确定您会发现值 0,如记录所示

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

于 2014-05-02T17:00:06.243 回答
0

java.time

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

请注意,旧的日期时间 API(java.util日期时间类型及其格式化 API SimpleDateFormat)已过时且容易出错。建议完全停止使用它并切换到java.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]

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

Trail: Date Time了解有关现代日期时间 API *的更多信息。


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

于 2021-05-04T12:58:20.773 回答