论坛首页 Java企业应用论坛

Date with timezone convert

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

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

最近客户要求在对于取日期要根据 申请者 所在时区的时间来计算。
例如 一个来自美国西部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, 很详细 http://www.ibm.com/developerworks/cn/java/l-datetime/part2/index.html


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

引用
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. ...


 	    // 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
   发表时间:2008-03-27  
Java的SimpleDateFormat可以设置TimeZone,这样得到的日期就正确了。
比如布里斯班和悉尼都是东10区,但是悉尼有夏令时,所以比布里斯班要快1小时(夏天的时候)

TimeZone timeZoneSYD = TimeZone.getTimeZone("Australia/Sydney");
TimeZone timeZoneBNE = TimeZone.getTimeZone("Australia/Brisbane");

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZoneSYD);
Date date = new Date();
System.out.println(sdf.format(date));

sdf.setTimeZone(timeZoneBNE);
System.out.println(sdf.format(date));
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics