`
CherryRemind
  • 浏览: 54839 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Date with timezone convert

    博客分类:
  • Java
阅读更多
    中国在行政上对全国各地都定义一个统一的时区,也就是我们通常所说的"北京时间"。而美国大陆本土有 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
分享到:
评论
1 楼 usherlight 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));

相关推荐

    php报时区错误,按照网上说的改时间date.timezone根本不管用!怎么解决,看我的.zip

    php报时区错误,按照网上说的改时间date.timezone... You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still

    Oracle Timestamp with Time zone & java

    Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...

    php.ini中date.timezone设置详解

    `date()`函数则用于格式化和输出日期和时间,可以根据`date.timezone`设置的结果来显示相应时区的时间。 `extract()`函数虽然不是专门处理日期和时间的,但它是一个非常实用的数组处理函数,可以将数组中的键值对...

    php.ini中date.timezone设置分析

    date.timezone设置php5默认date.timezone为utc,改为date.timezone = PRC即可解决时间相差八小时的问题,但我在php的官方文档中看了半天也没找到这个参数啊

    Microsoft Date and Time Picker Control6.0

    《Microsoft Date and Time Picker 控件6.0详解》 在Windows应用程序开发中,日期和时间选择功能是一项不可或缺的元素,Microsoft Date and Time Picker Control 6.0便是为此目的设计的控件。它允许用户在界面上...

    前端项目-moment-timezone.zip

    "前端项目-moment-timezone.zip" 是一个专门针对时区处理的前端项目,它基于著名的JavaScript库Moment.js,并扩展了对时区支持的功能。这个项目旨在帮助开发者更准确、方便地分析和展示全球各地的时刻。 首先,我们...

    前端项目-timezone-js.zip

    **前端项目-timezone-js** 是一个基于Olson时区数据的JavaScript库,专门用于处理和显示全球不同时区的时间。这个库为Web开发者提供了一种简单有效的方式来处理时区转换和时间显示,尤其是在构建需要跨时区交互的Web...

    关于php程序报date()警告的处理(date_default_timezone_set)

    You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely ...

    Date and Time Picker(日期时间控件)(源码)

    (C++)此代码在Windows Mobile平台下VS2005调试通过,实现了Date and Time Picker控件的简单功能。此控件我在MFC和WIN32下各做了个DEMO。如果对你有用记得回来评论哦.....

    PHP date_default_timezone_set()设置时区操作实例分析

    echo function_exists(date_default_timezone_set). ;//在这他总是返回1,这函数是判断这里面的字符是不是一个定义了的函数名 echo date('Y-m-d H:i:s'). ;//默认时区的时间 echo date_default_timezone_set...

    angular-date-time

    **Angular Date Time 插件详解** Angular Date Time 是一个基于 AngularJS 的插件,它为开发者提供了方便的方式来处理日期和时间。在Web开发中,尤其是使用AngularJS框架时,处理日期和时间通常是一项复杂的任务,...

    微软中国农历日期和时间Microsoft.Chinese.Date&Time;

    微软的中国农历日期和时间组件(Microsoft.Chinese.Date&Time)是专为Windows操作系统设计的一款实用工具,旨在提供农历日期和时间的显示功能。这款软件是微软为了满足在中国及全球华人社区用户的需求而开发的,它...

    Laravel开发-timezone

    在Laravel框架中,`timezone`是一个非常关键的设置,它影响着整个应用程序中的日期和时间处理。`timezone`配置允许开发者指定应用默认时区,确保时间显示与用户所在的地理位置相匹配,提供更好的用户体验。本篇文章...

    详解Java中的时区类TimeZone的用法

    此外,`TimeZone` 的 `useDaylightTime()` 方法可以用来判断时区是否使用夏令时,但实际判断夏令时是否生效应依赖于 `inDaylightTime(Date time)` 方法。 总的来说,`TimeZone` 类在Java中提供了处理日期和时间时区...

    boost_date_time-vc100-mt-1_49.dll

    标题中的"boost_date_time-vc100-mt-1_49.dll"是一个动态链接库(DLL)文件,属于Boost库的一部分,专门用于日期和时间处理。Boost库是一个广泛使用的C++库集合,旨在提升C++的标准库功能,提供跨平台的、高质量的、...

    Delphi 无控件实现TimeZone世界时间对照程序

    在本文中,我们将深入探讨如何使用Delphi编程语言无控件地实现一个TimeZone世界时间对照程序。这个程序的目的是在不依赖任何特定图形用户界面组件的情况下,帮助用户查看选定时间在全球主要城市的时间对应情况,这...

    mongoose-timezone:Mongoose插件以标准化存储日期时区

    const timeZone = require ( 'mongoose-timezone' ) ;const Schema = new mongoose . Schema ( { date : Date , subDocument : { subDate : { type : Date , } , } ,} ) ;// If no path is given, all date fields ...

    fortran-在fortran中对于Date和Time的操作.zip

    在Fortran编程语言中,处理日期(Date)和时间(Time)是常见的需求,尤其是在科学计算和数据分析领域。Fortran提供了内置的日期和时间处理功能,使得程序员可以方便地获取当前日期、设置特定日期、计算时间差等。...

Global site tag (gtag.js) - Google Analytics