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

fol*_*one 4 java locale gmt

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

class MyOleDateTime extends Date {

    static {
        Locale.setDefault(WhatGoesHere?)
    }

    // ... some constructors
    // ... some methods
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*rev 7

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

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

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


Jes*_*per 6

正如Michael Borgwardt所说,Java Date对象对时区一无所知.它只是自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
Run Code Online (Sandbox Code Playgroud)