Date with timezone convert

中国在行政上对全国各地都定义一个统一的时区,也就是我们通常所说的"北京时间"。而美国大陆本土有 5 个主要时区(Arizona州单独一个时区),再加夏威夷时区和阿拉斯加时区。国土面积不大的澳大利亚竟有 5 个时区。但是如果我们所开发的应用是要考虑支持多个时区共享使用时,我们需要对 Java 的时区要有一个了解。例如,如何将一个时区下定义的时间转换到另一个时区来显示,等等问题。

全球时区参考[url]http://greenwichmeantime.com/time-zone/[/url]

最近客户要求在对于取日期要根据 申请者 所在时区的时间来计算。
例如 一个来自美国西部CA州的人, 处在美国东部IL州, Server不管在哪里。
CurrentDate(当前时间) 是应该取 以Server时间为准,换算成申请者来自与州的时间。
因为当前时间可能相差一天。

// 现有代码,好多取当前时间直接 new Date() 只是取当前Server的时间
new Date();


Java的Date型没有对 timezone 支持,而现在代码日期都是Date, DB也是存Date型
我们都知道使用 calendarInstance.getTime() 来转换成 Date

// 使用指定时区 PST(太平洋时区) 和默认语言环境获得一个日历。
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("PST"));
// 使用默认时区和语言环境获得一个日历。
Calendar calendar2 = Calendar.getInstance();

System.out.println(calendar.getTime() + " " + calendar.getTimeInMillis());
System.out.println(calendar2.getTime() + " " + calendar2.getTimeInMillis());

惊讶的发现, 直接这样转换, 打出的来结果是一样的.

后来自己的代码写这样, 相信大家在写代码的时候也遇到过类型的问题,如果有更好的方法, 请不吝赐教


private static Map<String, String> US_TimeZoneMap = null;

/**
* Get right timezone date by calendar
*
* @param stateCode state name
* @return Date timezoneDate
*/
@SuppressWarnings("deprecation")
public static Date getTimezoneDate(String stateCode)
{
Calendar calendar = Calendar.getInstance(getTimezone(stateCode));
Date date = new Date(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
return date;
}

/**
* Get timezone type by state name
*
* @param stateCode
* @return TimeZone
*/
public static TimeZone getTimezone(String stateCode)
{
return TimeZone.getTimeZone(initializeTimezoneMap().get(stateCode));
}

/**
* Initialize a map store timezone info
*
* @return Map timezone Map
*/
public static Map<String, String> initializeTimezoneMap()
{
if (US_TimeZoneMap == null)
{
US_TimeZoneMap = new HashMap<String, String>();
US_TimeZoneMap.put("CA", "PST");
US_TimeZoneMap.put("CO", "MST");
// ...
US_TimeZoneMap.put("IL", "CST");
US_TimeZoneMap.put("GA", "EST");
}

return US_TimeZoneMap;
}


这篇文章介绍java timezone, 很详细 [url]http://www.ibm.com/developerworks/cn/java/l-datetime/part2/index.html[/url]


还有个开源的Java date and time classes -----[b]Joda[/b]. [url]http://joda-time.sourceforge.net/index.html[/url]

[quote]Joda-Time has been created to radically change date and time handling in Java. The JDK classes Date and Calendar are very badly designed, have had numerous bugs and have odd performance effects. ...[/quote]


// get current moment in default time zone
DateTime dt = new DateTime();
// translate to London local time
DateTime dt2 = dt.withZone(DateTimeZone.forID("America/Los_Angeles"));

// This is similar in concept to the default time zone of the java.util.TimeZone class.
DateTimeZone defaultZone = DateTimeZone.getDefault();
DateTimeZone.setDefault(myZone);


试用了下,感觉还不错,支持TIMEZONE挺好的。 以后可以考虑使用。
有的国外项目直接用joda的 Datetime取代SUN 的Date
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值