我正在使用这样的文件进行一些测试:
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
中没有文件时我会得到这个输出。为什么不返回null
或0
?
答案 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.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.time
,modern 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 desugaring 和 How to use ThreeTenABP in Android Project。