如何使日期区域设置独立?

时间:2010-04-23 09:42:37

标签: java locale gmt

我有一个数据库,它以OleDateTime格式存储日期,格式为GMT时区。我已经实现了一个类,在java中扩展Date以表示经典日期格式。但我的班级依赖于语言环境(我在GMT + 2)。因此,它将db中的日期转换为date - 2 hours。如何正确转换日期?我希望我的班级与语言环境无关,总是使用GMT时区。实际上,问题是:

class MyOleDateTime extends Date {

    static {
        Locale.setDefault(WhatGoesHere?)
    }

    // ... some constructors
    // ... some methods
}

5 个答案:

答案 0 :(得分:7)

嗯,最好像其他答案一样使用Calendar对象。但是,如果确实想要设置全局时区,则可以在应用程序代码的早期使用TimeZone.setDefault(TimeZone.getTimeZone("UTC"));。还有user.timezone Java系统属性。

另外(很有趣),看来实际生活在GMT / UTC时间(没有夏令时变化)的唯一国家是利比里亚。

事实上,Date个对象本身总是区域设置和时区独立。它的getTime()方法将始终返回自1970年1月1日00:00:00(不计算闰秒)以UTC 以来传递的毫秒数。但是如果你想得到毫秒以外的东西,你必须使用Calendar 依赖于时区。但这是正确的方法。您不在Date课程中使用那些已弃用的方法,对吗?

答案 1 :(得分:6)

正如Michael Borgwardt所说,Java Date对象对时区一无所知。它只是自01-01-1970 00:00:00 UTC以来的一个毫秒的包装器。

只有当您使用DateString对象转换为DateFormat时,才开始处理时区。您可以在DateFormat上设置时区,以指定您希望在哪个时区看到Date

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("UTC"));

String text = df.format(date);  // text will contain date represented in UTC

答案 2 :(得分:2)

日期 与区域设置无关,始终使用GMT时区。它只是GMT中毫秒时间戳的包装器(更准确地说是:UTC)。

Date中与时区相关的唯一内容是不推荐使用的方法,例如getDay() - 这就是他们被弃用的原因。那些使用默认时区。正确的做法是避免使用那些弃用的方法 - 而不是将默认时区设置为UTC!这可能会在其他地方引起问题,并且您无法阻止代码的其他部分将默认时区设置为其他部分。

答案 3 :(得分:0)

使用Calendar对象:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                                    locale);

答案 4 :(得分:0)

这是我用来计算Calendar实例的GMT偏移量并将其格式化的片段。我感谢我从这个网站获得的所有帮助,很高兴为此做出贡献。我希望这可以帮助某个人。享受。

Calendar calInst = Calendar.getInstance();

//calculate the offset to keep calendar instance GMT
int gmtOffsetMilli = calInst.get(Calendar.ZONE_OFFSET);
long gmtOffsetHr = TimeUnit.HOURS.convert(gmtOffsetMilli, TimeUnit.MILLISECONDS);

calInst = Calendar.getInstance(TimeZone.getTimeZone("GMT " + gmtOffsetHr));