【问题标题】:Does java Date handles localization(one of the reason to choose Calendar over Date)?java Date 是否处理本地化(选择日历而不是日期的原因之一)?
【发布时间】:2013-05-18 17:25:37
【问题描述】:

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

日历.getInstance()

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

新日期()

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

对吗?

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

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

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

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

    【讨论】:

    • 正如您所说“日期代表时间的瞬间,不关心时区和语言环境”。我的问题是,如果我在美国和德国的两个不同的盒子上执行 new Date(),它会返回相同的值。如果是,这是否意味着该值将代表相对于 GMT 等标准时间的瞬间
    • 如果您对 Joda 感兴趣,请查看 github.com/ThreeTen/threetenbp,这是 java 8 中新日期 API 的 java 7 实现
    • 所以如果我在迪拜的机器上执行 date.getDay() 并返回代表星期一的 int。那么它在迪拜不一定是星期一,但如果我做 Calndar.DAY_OF_WEEK 它肯定会在星期一返回。对吗?
    • 如果在世界上两个不同地方执行的两个程序同时执行 new Date(),它们将得到相同的值。此值是自 1970 年 1 月 1 日 00:00 UTC 表示的时刻以来经过的毫秒数。
    • 你不应该调用 date.getDay(),因为它已被弃用。它返回当前时区中此日期所在的日期。从 Calendar 对象获取日期将返回该日期在 Calendar 对象的时区中的日期(在构建时选择)。
    【解决方案2】:

    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" 运行它,您会得到 ​​p>

    Sat May 18 12:14:47 EEST 2013
    

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

    Sat May 18 09:14:47 GMT 2013
    

    这是因为 Date 实际上在内部使用了一个 Calendar 实例来从 从“纪元”到实际时间值的英里数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多