我有一个数据库,它以OleDateTime
格式存储日期,格式为GMT时区。我已经实现了一个类,在java中扩展Date
以表示经典日期格式。但我的班级依赖于语言环境(我在GMT + 2)。因此,它将db中的日期转换为date - 2 hours
。如何正确转换日期?我希望我的班级与语言环境无关,总是使用GMT时区。实际上,问题是:
class MyOleDateTime extends Date {
static {
Locale.setDefault(WhatGoesHere?)
}
// ... some constructors
// ... some methods
}
答案 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以来的一个毫秒的包装器。
只有当您使用Date
将String
对象转换为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));