文件lastModified()返回Wed Dec 31 19:00:00 EST 1969

时间:2014-05-02 16:56:14

标签: java file-io time

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

    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

2 个答案:

答案 0 :(得分:6)

不,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错误

答案 1 :(得分:0)

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 代表祖鲁语,代表 UTC(时区偏移 +00:00 小时)。

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


* 出于任何原因,如果您必须坚持使用 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