1

我总是更喜欢使用日历而不是日期类,因为它对日期操作的鲁棒性(另外我在某处读到日期类主要存在因为可能在 jdk 1.1 之前的向后兼容性)。但我认为今天我还有一个使用日历的理由,即日历处理本地化,这意味着当我这样做时

日历.getInstance()

它将根据部署代码的框的时区和区域设置返回日历对象。但是当我这样做时

新日期()

它将返回相对于 GMT 的日期对象(这就是我通过http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Date.html#Date()后得到的感觉)

那是对的吗?

4

2 回答 2

4

Date 代表时间的瞬间,不关心时区和语言环境。当您想为人类解析或格式化日期(使用 SimpleDateFormat),或者当您开始将日期与某个挂钟值进行比较时,您只关心时区和语言环境,想知道日期是否在给定的月份、日期内或小时,或添加天数并考虑夏令时(在这种情况下,您将日期转换为日历)。

所以 Date 本质上并不是一个不如 Calendar 有用的类。它只是没有相同的目的。两者是互补的。

无论如何,我建议使用 joda-time,这是一个更好的 API,但仍然具有相同的瞬间和分区日期时间概念。

于 2013-05-18T09:07:08.860 回答
0

对象内部将Date日期存储为自 1970 年 1 月 1 日 UTC 以来的毫秒数。但是,当您访问例如由Date对象表示的小时时,它确实会考虑时区信息。这可以使用这个简单的代码来验证:

import java.util.Date;
public class Main {

    public static void main(String[] args) {
        Date date = new Date(1368868487441L);

        System.out.println(date);
    }
}

现在,如果你运行它设置时区(作为 JVM 启动参数),-Duser.timezone="Europe/Sofia"你会得到

Sat May 18 12:14:47 EEST 2013

但是如果你把它改成-Duser.timezone="America/Arizona"结果是不同的

Sat May 18 09:14:47 GMT 2013

这是因为Date实际上在Calendar内部使用一个实例将自“纪元”以来的 milis 数转换为实际时间值。

于 2013-05-18T09:25:37.823 回答