2010-04-23 68 views
3

我有一个分贝,它以格林尼治标准时间格式存储OleDateTime格式的日期。我已经实现了一个类,在java中扩展Date以表示经典日期格式。但我的课程是依赖于地区的(我在GMT + 2)。因此,它将db中的日期转换为date - 2 hours。我如何使它正确地转换日期?我希望我的课程能够独立于语言环境,并始终使用GMT时区。其实,问题是:如何使日期区域独立?

class MyOleDateTime extends Date { 

    static { 
     Locale.setDefault(WhatGoesHere?) 
    } 

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

回答

7

嗯,这是更好地使用日历对象一样建议在其他的答案。但是,如果您想要设置全球时区真的,则可以在应用程序代码的早期使用TimeZone.setDefault(TimeZone.getTimeZone("UTC"));。还有user.timezone Java系统属性。

另外(只是有趣的知道),它似乎是唯一的实际居住GMT/UTC时间(没有夏时制的变化)的国家是利比里亚。

事实上,Date对象本身是总是 locale-和时区无关。它的getTime()方法将始终返回自1970年1月1日00:00:00(不包括闰秒)以来的UTC毫秒数。但是如果你想得到的东西不是毫秒,你必须使用Calendar,其中与时区相关的。但这是正确的路要走。你不会在Date课中使用过时的方法,是吗?

+0

是的,这就是我一直在寻找的,非常感谢。 – folone 2010-04-23 10:05:45

+1

*叹*他在那里,愉快地做错事... – 2010-04-23 10:07:35

+0

@迈克尔但我真的没有访问客户端代码,使用我的课程。它*不会*使用已弃用的日期api。那我该怎么办? – folone 2010-04-23 10:10:53

0

使用Calendar对象:

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

我的课堂在很多地方都用作日期,我无法改变。 – folone 2010-04-23 09:53:21

2

A 日期语言环境无关,总是使用GMT时区。它仅仅是GMT格式的一个毫秒时间戳的包装器(更正确的说:UTC)。

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

6

正如Michael Borgwardt所说的,Java Date对象不知道任何关于时区的信息。从01-01-1970 00:00:00 UTC开始,它仅仅是几毫秒的包装。

只有当您例如使用DateFormatDate对象转换为String时,才开始处理时区。您在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 
0

这是我用来计算GMT从Calendar实例偏移和格式化一个片段。我很欣赏我从这个网站获得的所有帮助,它很高兴为您做出贡献。我希望这可以帮助别人。请享用。

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));