浏览 6164 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-24
全球时区参考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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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)); |
|
返回顶楼 | |