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

Java 如何使日期区域设置独立?,java,locale,gmt,Java,Locale,Gmt,我有一个db,它以GMT时区的OleDateTime格式存储日期。我实现了一个类,用java扩展了Date,以经典的日期格式表示。但是我的类依赖于语言环境(我在GMT+2)。因此,它将数据库中的日期转换为日期-2小时。如何使其正确转换日期?我希望我的类与语言环境无关,始终使用GMT时区。事实上,问题是: class MyOleDateTime extends Date { static { Locale.setDefault(WhatGoesHere?) }

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

class MyOleDateTime extends Date {

    static {
        Locale.setDefault(WhatGoesHere?)
    }

    // ... some constructors
    // ... some methods
}
使用对象:


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

另外(有趣的是),似乎唯一一个真正使用GMT/UTC时间(没有夏令时变化)的国家是利比里亚

事实上,
Date
对象本身始终与区域设置和时区无关。它的
getTime()
方法将始终返回自1970年1月1日00:00:00(不计算闰秒)以来经过的毫秒数(UTC)。但是,如果您想获得毫秒以外的数据,则必须使用与时区相关的
日历。但这是正确的选择。您不会在
Date
类中使用不推荐的方法,是吗?

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


Date
中唯一依赖于时区的方法是不推荐使用的方法,如
getDay()
——这就是它们不推荐使用的原因。它们使用默认时区。正确的做法是避免使用那些不推荐使用的方法—不要将默认时区设置为UTC!这可能会在其他地方引起问题,您无法阻止代码的其他部分将默认时区设置为其他内容。

正如Michael Borgwardt已经说过的,Java
Date
对象对时区一无所知。从1970年1月1日00:00:00 UTC开始,它只是一个毫秒数的包装器

仅当您使用
日期格式
日期
对象转换为
字符串
时,才开始处理时区。您可以在
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

下面是我用来计算
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));

我的类在许多地方被用作日期,我不能更改它。@Michael,但我确实没有访问使用我的类的客户端代码的权限。它确实使用了不推荐使用的日期api。那我该怎么办?@Alexander我其实不知道。但我很确定,我的客户是这样的。那么,我如何在不破坏他们的代码的情况下纠正错误呢?@folone:如果你不能让他们纠正已经破坏的代码,那么你将不得不使用一个可以在某些代码更改默认时区时破坏的应用程序。@Michael:那绝对不酷。我会努力说服其他团队的成员相应地修改代码。谢谢
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));