`
swingboat
  • 浏览: 61831 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

不同时区之间,时间的转换?

    博客分类:
  • java
阅读更多
一、问题描述
   当软件需要国际化的时候,我们不得不考虑时间的问题。不同的地方有不同的时区,从而显示的时间是不一样的。而且很多国家在某一段时间还可能会实行夏令时,显示的时间又不一样。为了保证时间的正确性,必须有统一的基线,从而不得不考虑下列时间之间的转换。
   a、long timeToUTC(time,timezone)                //把给定的时间根据给定的时区转化为UTC
   b、String UTCToTime(long,timezone)              //把给定的UTC转化为制定时区的时间
   c、timeToTime(time,timezone1,timezone2)         //把给定的时间根据制定的时区转化为另指定时区的时间
   //考虑到数据的存储,还必须考虑数据库对于时间字段的格式。

二、解决方法
   显示时间的不同,主要原因的是时区不同。如果不考虑自定义时区的问题,JODA包就能很好解决上面的问题,但是如果考虑自定义时区(很多软件由于考虑夏令时,从而增加了自定义时区的功能来设置夏令时),则我们必须自己来写转换函数。
   a、JODA
 1public long timeToUTC(String theSourceTime, int sourceWbxTZID)
 2        throws Exception {
 3        DateTime targDate;        
 4        if (sourceWbxTZID == (-1)) {  //UTC
 5            //mdyFormatter:org.joda.time.format.DateTimeFormatter
 6            targDate = mdyFormatter.withZone(DateTimeZone.UTC).parseDateTime(theSourceTime);//
 7        }
 else {
 8            targDate = mdyFormatter.withZone(
 9                DateTimeZone.forID(convertTimezone(sourceWbxTZID)))
10                .parseDateTime(theSourceTime);
11        }

12        return targDate.getMillis();
13    }
   
14    public String UTCToTime(long theUTCTime, int targetWbxTZID)
15        throws Exception {
16        DateTime theSourceTime = new DateTime(theUTCTime);
17        if (targetWbxTZID == (-1)) {
18            return mdyFormatter.withZone(DateTimeZone.UTC).print(theSourceTime);
19        }
 else {
20            return mdyFormatter.withZone(
21                DateTimeZone.forID(convertTimezone(targetWbxTZID))).print(
22                theSourceTime);
23        }

24    }

   b、自编写
 1/** *//**
 2   *sourceDate:需要转换的日期,此日期必须是居于GMT的时间。
 3   *timezone:
 4   *gMT:是否是GMT时间
 5   *isConsiderDayLight:是否考虑夏令时
 6   */

 7  private long convert(Date sourceDate, Timezone timezone, boolean gMT, boolean isConsiderDayLight) throws Exception {
 8    int gMTOffSet = (int) timezone.getGmtOffset();//获取偏移量
 9    long sourceTime = sourceDate.getTime();
10    if (gMT) {
11        targetTime = sourceTime + gMTOffSet * 60 * 1000;
12    }
 else {
13        targetTime = sourceTime + ( -1* gMTOffSet * 60 * 1000;//北京偏移8个小时,如是:-8*60*1000
14    }

15    //下面是考虑夏令时
16    
17    return targetTime;
18    
19  }

20  public long timeToUTC(String theSourceTime, int sourceWbxTZID)
21        throws Exception {
22        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");        
23        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
24        Date date=sdf.parse(theSourceTime);                
25        Timezone timezone=(Timezone)keyedByWbxTZID.get(String.valueOf(sourceWbxTZID));//此函数主要是获取Timezone相关的数据
26        return convert(date,timezone,false,true);        
27  }
 
28  public String UTCToTime(long theUTCTime, int targetWbxTZID)
29        throws Exception {
30        Date date=new Date();
31        date.setTime(theUTCTime);
32        Timezone timezone=(Timezone)keyedByWbxTZID.get(String.valueOf(targetWbxTZID));//此函数主要是获取Timezone相关的数据
33        long time=convert(date,timezone,true,true); 
34        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
35        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
36        return sdf.format(new Date(time));
37  }


三、相关的一些时间概念 
GMT:就是格林威治标准时间的英文缩写,格林威治是伦敦泰晤士河南岸的一个地方,由于从19世纪开始,因为世界各国来往频繁,而欧洲大陆、美洲大陆和亚洲大陆都有各自的时区,所以为免混乱,各国的代表就在1884 年在美国华盛顿召开了国际大会,通过协议选出伦敦的格林威治,作为全球时间的中心点,格林威治标准时间因而诞生。所以有GMT功能的腕表就是说腕表拥有其中的小时表盘可以显示GMT时间。

UTC:短波传送很远,可能经过许多国家、许多不同时区,所以需要有一统时间作标准, 这个标准时间Co-ordinated Universal Time 缩写UTC 或称 UT。过去称为格林威治时间(GMT),虽然有些地方有冬令时间或夏令时间,但UTC时间是不会改的,大家都以它为标准。

DST:Daylight saving time .(夏令时,各个国家开始和结束时间的计算方法是不一样的)
美国,加拿大夏令时起止时间:每年3月份第二个星期天到11月份第一个星期天(亚利桑那州、夏威夷、波多黎各、维尔京群岛和美属萨摩亚除外)。

德国、意大利等多数欧洲国家夏令时起止时间:每年3月份最后一个星期天到10月份最后一个星期天。


MST:Mountain Standard Time
PST:Pacific Standard Time
EST:Eastern Standard Time

很多朋友对于美剧官方网站上的时间表达方式不是很理解。
这里说明一下,以Prison Break为例:Monday 8/7c
它指的是:星期一 东部时间8点 中部时间7点。两地同时播放,不过因为时差问题,钟表上显示的时间有一个小时的差别。
尽管官网的播放时间对于美国以外的朋友来说意义不大,不过如果你愿意查出相对应的北京时间,可以使用http://www.worldtimeserver.com 的服务,我相信国内也有很多类似的时间转换网站,包括google,百度都可以,这里就不再罗嗦了。至少目前来说,美东时间和北京时间相差12小时,也就是说,我们比美东快12个小时。Prison Break的播放时间就是北京时间第二天的早上8点,也就是星期二 8:00AM.

相对于美国,我们国家的时区划分相对简单很多,特别是取消夏令时后,不出国,我们基本上不用考虑时差问题。

美国本土大陆地区采用的时区自东向西为:
东岸标准时区 (Eastern Standard Time; EST; UTC-5; R区),包括大西洋沿岸各州、墨西哥湾及密西西比河以东地区。
中部标准时区 (Central Standard Time; CST; UTC-6; S区),包括密西西比河沿岸以及以西州份的大部份。
山部标准时区 (Mountain Standard Time; MST; UTC-7; T区), 沿大陆分水岭—洛矶山一线的州份、大盆地及科罗拉多河流淢。
太平洋标准时区 (Pacific Standard Time; PST; UTC-8; U区),包括太平洋沿岸地区及内华达州。

美国本土大陆地区以外地区采用的时区
阿拉斯加标准时区 (Alaska Standard Time; AKST; UTC-9; V区) 包括阿拉斯加州大部份地区。
夏威夷—阿留申时区 (Hawaii-Aleutian Standard Time,非正式:夏威夷标准时 Hawaii Standard Time; HST; UTC-10; W区),包括夏威夷州及169°30'W以西的阿留申群岛。

美国属土采用的时区
大西洋标准时区 (Atlantic Standard Time; AST, UTC-4; Q区) 包括波多黎各及美属处女岛。
萨摩亚时区 (Samoa Standard Time; UTC-11, X区)包括美属萨摩亚。
查莫罗时区 (Chamorro Standard Time; UTC+10, Zone K)包括关岛及北马里亚纳群岛。

中国的时区:我们使用北京时间,以前称中原标准时间,现在台湾依然使用这个名称,是中国大陆、香港、澳門和台湾的标准时间。在时区划分上,属东八区,比世界协调时早8小时,记为UTC+8。

严格地讲,北京时间并不是北京(东经116°)地方的时间,而是东经120°度地方的地方时间。而北京时间也不是在北京确定的,而是由位于中国版图几何中心位置陕西临潼的中国科学院国家授时中心的9台铯原子钟和2台氢原子钟组通过精密比对和计算实现,并通过卫星与世界各国授时部门进行实时比对。

清光绪28年(公元1902年),中国海关曾制定海岸时,以东经120度之时刻为标准。公元1912年,位于北京的中央观象台将全国分为五个时区,民国28年3月9日中华民国内政部召集标准时间会议,确认1912年划分之时区为中华民国标准时区。分别为:
1昆仑时区 UTC+5.5 新疆西部与部分西藏
2新藏时区 UTC+6 新疆及西藏
3陇蜀时区 UTC+7 中国中部
4中原标准时区 UTC+8 中国海岸
5长白时区 UTC+9 中国东北
1949年之后,中国大陆将“中原标准时间”改称“北京时间”,并在全国统一使用该时间作为标准时间。台湾则维持“中原标准时间”之名称,也有称“台北时间”或“国家标准时间”。

由于中国大陆全境都采用北京时间作为标准时,因此在中国西部的陕西、甘肃、新疆等省和自治区造成了生活不便,比如在乌鲁木齐,北京时间比当地时间提前两个小时,北京时间早8时30分(中国大陆公务机关通行的上班时间)相当于当地时间早晨6时30分。作为解决措施,一些新疆地区居民使用乌鲁木齐时间,即东六区(UTC+6)时间。

2005年,一些中华人民共和国全国人民代表大会代表提出将中国大陆时区加以细分的建议,提议分为以北京时间为基础的东部时间(UTC+8)、以陕西地区时间为基础的中部时间(UTC+7)和以新疆、西藏地区时间为基础的西部时间(UTC+6)。后又将该提议改为分为两个时区,即UTC+8和UTC+7两个时区,陕西、四川、重庆、贵州、云南及以西各省采用UTC+7的西部时间。但该提案尚未赴诸表决。

分享到:
评论

相关推荐

    Java对世界不同时区timezone之间时间转换的处理方法

    了解时区的概念是进行时区之间时间转换的基础。 二、如何在不同时区之间转换时间 在不同时区之间转换时间需要考虑两个问题:获取到源时区相对于GMT的差距(考虑夏令时)和获取到目的时区相对于GMT的差距(考虑夏令...

    matlab开发-在工作时区与日光节约时间之间进行转换

    `TimezoneConvert.m` 文件提供了一个功能强大的函数,能够帮助用户轻松地在不同的时区之间转换日期和时间,同时考虑日光节约时间的影响。 日光节约时间是一种为了节省能源而调整时钟的做法,通常在夏季实施,使得一...

    获取时区,根据时区做 UTC时间到本地时间之间转换

    {* 用于读取时区注册表TZI(长度为44)的属性值,存储时区信息 *} PRegTZIInfo = ^TRegTZIInfo; TRegTZIInfo = record Bias: Longint; StandardBias: Longint; DaylightBias: Longint; StandardDate: ...

    标准时间转换器

    总的来说,标准时间转换器是一个实用的工具,它简化了Unix时间戳与人类可读日期之间的转换过程,这对于处理时间相关的IT任务至关重要。无论是在数据分析、日志分析还是日常开发工作中,这个工具都能提供高效且准确的...

    UTC时间转换算法

    当从UTC时间转换为RTC时间时,我们需要考虑用户所在的时区和夏令时(DST, Daylight Saving Time)。UTC不包含时区信息,因此转换过程中需要结合地理位置和当前日期来确定适当的时区偏移。例如,如果用户位于东八区...

    如何在Oracle 9i中正确转换时区

    Oracle 9i文档中推荐使用FROM_TZ函数来替换NEW_TIME,但需要注意的是,FROM_TZ函数只是将一个带有时区信息的时间戳转换为另一个时间表示,它并不实现时区之间的实际转换。例如,FROM_TZ可以将一个TIMESTAMP WITH ...

    在python 不同时区之间的差值与转换方法

    在给定的代码片段中,主要展示了如何计算两个不同时区之间的差值,并根据这个差值调整起止时间。这里以一个假设的场景为例,原始程序设定的时间范围是北京时间(东八区)的2点到8点。当程序运行在其他时区,如韩国或...

    GPS UTC 时间转换

    4. **时间区和夏令时**:UTC是不考虑时区和夏令时的,但在某些应用场景中,可能需要将UTC时间转换为特定时区的本地时间,这涉及到时区偏移和夏令时规则。 5. **转换算法**:GPS和UTC之间的转换算法通常涉及简单的加...

    UTC与本地时间转换函数

    自实现的UTC时间与本地时间的转换(这里只转换成了UTC0区,要到自己的时区自己加上偏移....工具会把时间自动从UTC时间转换成年月日后进行时区校正.因此如果想要结果一致.请把系统时间(windows)调整为UTC0区.

    UTC时间转换工具

    2. 时区调整:由于输入的时间可能包含本地时区信息,工具需要将这个时间转换为UTC,这通常涉及到加减时区偏移量的过程。例如,如果用户在东八区,那么需要将时间加上8小时来得到对应的UTC时间。 3. UTC时间计算:...

    时间、IP转换工具

    时间转换工具有助于在这些时间格式之间进行转换,例如,从用户输入的本地时间转换为UTC,或将UTC时间戳转换为可读的日期和时间。此外,工具可能还会提供时区转换功能,以便用户了解不同地区的时间。 其次,我们讨论...

    JavaScript 脚本将当地时间转换成其它时区

    JavaScript中的时间转换涉及到对日期和时间的理解,以及如何在不同时区之间进行转换。在JavaScript中,日期和时间处理主要依赖于`Date`对象。以下是对标题和描述中提到的知识点的详细说明: 1. **获取当地时间**: ...

    日期时间转换工具.zip

    日期时间转换工具是一种在计算机软件领域中常见的实用程序,它主要功能是帮助用户在不同的日期时间格式之间进行转换。在日常工作中,我们可能需要处理来自不同系统或国家的日期和时间数据,这些数据可能遵循各自的...

    标准时间UTC相互转换工具

    1. 时间和日期类的使用:在C#中,DateTime类用于表示日期和时间,TimeZoneInfo类则用于处理不同时区之间的转换。 2. UTC时间的处理:了解UTC时间的概念,以及如何在C#中进行UTC时间的计算和格式化。 3. 用户界面设计...

    十六进制与时间转换

    QQ是一款流行的即时通讯软件,它可能也涉及到时间转换,例如记录和显示用户之间的聊天时间,或者同步不同时区用户的在线状态。 在实际应用中,十六进制与时间转换的知识点可以广泛应用于网络编程、数据分析、日志...

    C++时间类 实现日期和秒之间的转换

    在C++编程中,时间处理是一项常见的任务,尤其是在开发涉及日期和时间的系统或...这个类可以扩展以支持更复杂的时间操作,如时间间隔、时区转换等。了解并熟练掌握这些基础概念对于任何C++开发者来说都是非常重要的。

    oracle时间time转换器

    然而,根据实际需求,我们可能需要将这些时间数据转换为不同的格式,或者从字符串形式解析到日期类型,这就需要用到时间转换器。 1. TO_DATE函数:这是将字符串转换为DATE类型的主要函数。例如,`TO_DATE('2022-01-...

    时间转换、IP转换工具

    本工具“时间转换、IP转换工具”提供了一系列功能,帮助用户在不同时间格式和IP表示之间进行便捷的转换。 首先,让我们深入了解一下时间戳与北京时间的转换: 1. **时间戳转成北京时间**: 时间戳是自1970年1月1...

    时间TimeTicks双向转换工具

    - **时区问题**:在进行时间转换时,需要考虑时区的影响,确保转换前后的时间含义保持一致。 - **精度问题**:不同的时间表示方式可能会有精度差异,如浮点数和整数表示的TimeTicks可能会有细微的精度损失。 - **...

    ios应用源码之获取全球当前所有时区的当前时间testtimezone 20181210

    通过计算两个时区之间的偏移量,我们可以将UTC时间转换为任意时区的时间。 4. **获取当前时间**: 要获取全球所有时区的当前时间,首先需要遍历`knownTimeZoneNames`获取所有时区ID,然后对每个ID创建对应的`...

Global site tag (gtag.js) - Google Analytics