6

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

class MyOleDateTime extends Date {

    static {
        Locale.setDefault(WhatGoesHere?)
    }

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

5 回答 5

10

好吧,最好像其他答案中建议的那样使用 Calendar 对象。但是,如果您真的想设置全球时区,您可以TimeZone.setDefault(TimeZone.getTimeZone("UTC"));在应用程序代码的早期使用。还有user.timezoneJava系统属性。

另外(很高兴知道),似乎唯一一个实际生活在 GMT/UTC 时间(没有夏令时更改)的国家是利比里亚。

事实上,Date对象本身总是与语言环境和时区无关。它的getTime()方法将始终返回自 1970 年 1 月 1 日 00:00:00 (不包括闰秒)以来经过的毫秒数UTC。但是如果你想得到毫秒以外的东西,你必须使用Calendar,这依赖于时区的。但这是正确的方法。您不会在Date课堂上使用那些已弃用的方法,对吗?

于 2010-04-23T10:02:12.627 回答
7

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

仅当您将Date对象转换为String使用 a时才开始处理时区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
于 2010-04-23T10:19:17.033 回答
2

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

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

于 2010-04-23T10:03:45.440 回答
0

使用日历对象:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                                    locale);
于 2010-04-23T09:50:21.867 回答
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));
于 2013-06-17T15:50:55.263 回答