在进行国际性软件项目开发的过程中,有时候会碰到一些比较特殊的要求。比如:比如说,你做的是个购物网站(假设服务器放在中国上海),当全世界客户在你的网站上下订单买东西后,往往希望看到客户所在地下单时间,比如说我是个美国纽约人,我在你的网站上下单后,你给我看到一个上海的下单时间,会觉得非常的奇怪。众所周知,纽约时间相对上海时间大约要晚13小时,如果让客户看到本地时区的时间,将变得更加符合客户的时间观念,使得客户理解比较方便。

其实,java中早已考虑过世界时区(TimeZone)这个问题,并给出了比较合理的解决方法,可以比较方便的进行世界时区时间的转化,将一个时区的时间转换成另一个时区的时间。可以看看下面的的实际例子(运行例子的main()方法)。

关于如何知道客户所在的时区,可以根据客户所在的ip或者用户注册提供的国家来计算出所在的时区。

  1. /*
  2. * Created on 2005-6-10
  3. * Author stephen
  4. * Email zhoujianqiang AT gmail DOT com
  5. * CopyRight(C)2005-2008 , All rights reserved.
  6. */
  7. package com.soft4j.utility;
  8.  
  9. import java.text.ParseException;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Date;
  12. import java.util.GregorianCalendar;
  13. import java.util.TimeZone;
  14. import java.util.Vector;
  15.  
  16. import com.soft4j.log.Log;
  17.  
  18. /**
  19. * 与日期、时间相关的一些常用工具方法.
  20. * <p>
  21. * 日期(时间)的常用格式(formater)主要有: <br>
  22. * yyyy-MM-dd HH:mm:ss <br>
  23. *
  24. * @author stephen
  25. * @version 1.0.0
  26. */
  27. public final class DateTool {
  28.  
  29. /**
  30. * 对日期(时间)中的日进行加减计算. <br>
  31. * 例子: <br>
  32. * 如果Date类型的d为 2005年8月20日,那么 <br>
  33. * calculateByDate(d,-10)的值为2005年8月10日 <br>
  34. * 而calculateByDate(d,+10)的值为2005年8月30日 <br>
  35. *
  36. * @param d
  37. * 日期(时间).
  38. * @param amount
  39. * 加减计算的幅度.+n=加n天;-n=减n天.
  40. * @return 计算后的日期(时间).
  41. */
  42. public static Date calculateByDate(Date d, int amount) {
  43. return calculate(d, GregorianCalendar.DATE, amount);
  44. }
  45.  
  46. public static Date calculateByMinute(Date d, int amount) {
  47. return calculate(d, GregorianCalendar.MINUTE, amount);
  48. }
  49.  
  50. public static Date calculateByYear(Date d, int amount) {
  51. return calculate(d, GregorianCalendar.YEAR, amount);
  52. }
  53.  
  54. /**
  55. * 对日期(时间)中由field参数指定的日期成员进行加减计算. <br>
  56. * 例子: <br>
  57. * 如果Date类型的d为 2005年8月20日,那么 <br>
  58. * calculate(d,GregorianCalendar.YEAR,-10)的值为1995年8月20日 <br>
  59. * 而calculate(d,GregorianCalendar.YEAR,+10)的值为2015年8月20日 <br>
  60. *
  61. * @param d
  62. * 日期(时间).
  63. * @param field
  64. * 日期成员. <br>
  65. * 日期成员主要有: <br>
  66. * 年:GregorianCalendar.YEAR <br>
  67. * 月:GregorianCalendar.MONTH <br>
  68. * 日:GregorianCalendar.DATE <br>
  69. * 时:GregorianCalendar.HOUR <br>
  70. * 分:GregorianCalendar.MINUTE <br>
  71. * 秒:GregorianCalendar.SECOND <br>
  72. * 毫秒:GregorianCalendar.MILLISECOND <br>
  73. * @param amount
  74. * 加减计算的幅度.+n=加n个由参数field指定的日期成员值;-n=减n个由参数field代表的日期成员值.
  75. * @return 计算后的日期(时间).
  76. */
  77. private static Date calculate(Date d, int field, int amount) {
  78. if (d == null)
  79. return null;
  80. GregorianCalendar g = new GregorianCalendar();
  81. g.setGregorianChange(d);
  82. g.add(field, amount);
  83. return g.getTime();
  84. }
  85.  
  86. /**
  87. * 日期(时间)转化为字符串.
  88. *
  89. * @param formater
  90. * 日期或时间的格式.
  91. * @param aDate
  92. * java.util.Date类的实例.
  93. * @return 日期转化后的字符串.
  94. */
  95. public static String date2String(String formater, Date aDate) {
  96. if (formater == null || "".equals(formater))
  97. return null;
  98. if (aDate == null)
  99. return null;
  100. return (new SimpleDateFormat(formater)).format(aDate);
  101. }
  102.  
  103. /**
  104. * 当前日期(时间)转化为字符串.
  105. *
  106. * @param formater
  107. * 日期或时间的格式.
  108. * @return 日期转化后的字符串.
  109. */
  110. public static String date2String(String formater) {
  111. return date2String(formater, new Date());
  112. }
  113.  
  114. /**
  115. * 获取当前日期对应的星期数.
  116. * <br>1=星期天,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五,7=星期六
  117. * @return 当前日期对应的星期数
  118. */
  119. public static int dayOfWeek() {
  120. GregorianCalendar g = new GregorianCalendar();
  121. int ret = g.get(java.util.Calendar.DAY_OF_WEEK);
  122. g = null;
  123. return ret;
  124. }
  125.  
  126. /**
  127. * 获取所有的时区编号. <br>
  128. * 排序规则:按照ASCII字符的正序进行排序. <br>
  129. * 排序时候忽略字符大小写.
  130. *
  131. * @return 所有的时区编号(时区编号已经按照字符[忽略大小写]排序).
  132. */
  133. public static String[] fecthAllTimeZoneIds() {
  134. Vector v = new Vector();
  135. String[] ids = TimeZone.getAvailableIDs();
  136. for (int i = 0; i < ids.length; i++) {
  137. v.add(ids[i]);
  138. }
  139. java.util.Collections.sort(v, String.CASE_INSENSITIVE_ORDER);
  140. v.copyInto(ids);
  141. v = null;
  142. return ids;
  143. }
  144.  
  145. /**
  146. * 测试的main方法.
  147. *
  148. * @param argc
  149. */
  150. public static void main(String[] argc) {
  151.  
  152. String[] ids = fecthAllTimeZoneIds();
  153. String nowDateTime =date2String("yyyy-MM-dd HH:mm:ss");
  154. System.out.println("The time Asia/Shanhai is " + nowDateTime);//程序本地运行所在时区为[Asia/Shanhai]
  155. //显示世界每个时区当前的实际时间
  156. for(int i=0;i <ids.length;i++){
  157. System.out.println(" * " + ids[i] + "=" + string2TimezoneDefault(nowDateTime,ids[i]));
  158. }
  159. //显示程序运行所在地的时区
  160. System.out.println("TimeZone.getDefault().getID()=" +TimeZone.getDefault().getID());
  161. }
  162.  
  163. /**
  164. * 将日期时间字符串根据转换为指定时区的日期时间.
  165. *
  166. * @param srcFormater
  167. * 待转化的日期时间的格式.
  168. * @param srcDateTime
  169. * 待转化的日期时间.
  170. * @param dstFormater
  171. * 目标的日期时间的格式.
  172. * @param dstTimeZoneId
  173. * 目标的时区编号.
  174. *
  175. * @return 转化后的日期时间.
  176. */
  177. public static String string2Timezone(String srcFormater,
  178. String srcDateTime, String dstFormater, String dstTimeZoneId) {
  179. if (srcFormater == null || "".equals(srcFormater))
  180. return null;
  181. if (srcDateTime == null || "".equals(srcDateTime))
  182. return null;
  183. if (dstFormater == null || "".equals(dstFormater))
  184. return null;
  185. if (dstTimeZoneId == null || "".equals(dstTimeZoneId))
  186. return null;
  187. SimpleDateFormat sdf = new SimpleDateFormat(srcFormater);
  188. try {
  189. int diffTime = getDiffTimeZoneRawOffset(dstTimeZoneId);
  190. Date d = sdf.parse(srcDateTime);
  191. long nowTime = d.getTime();
  192. long newNowTime = nowTime - diffTime;
  193. d = new Date(newNowTime);
  194. return date2String(dstFormater, d);
  195. } catch (ParseException e) {
  196. Log.output(e.toString(), Log.STD_ERR);
  197. return null;
  198. } finally {
  199. sdf = null;
  200. }
  201. }
  202.  
  203. /**
  204. * 获取系统当前默认时区与UTC的时间差.(单位:毫秒)
  205. *
  206. * @return 系统当前默认时区与UTC的时间差.(单位:毫秒)
  207. */
  208. private static int getDefaultTimeZoneRawOffset() {
  209. return TimeZone.getDefault().getRawOffset();
  210. }
  211.  
  212. /**
  213. * 获取指定时区与UTC的时间差.(单位:毫秒)
  214. *
  215. * @param timeZoneId
  216. * 时区Id
  217. * @return 指定时区与UTC的时间差.(单位:毫秒)
  218. */
  219. private static int getTimeZoneRawOffset(String timeZoneId) {
  220. return TimeZone.getTimeZone(timeZoneId).getRawOffset();
  221. }
  222.  
  223. /**
  224. * 获取系统当前默认时区与指定时区的时间差.(单位:毫秒)
  225. *
  226. * @param timeZoneId
  227. * 时区Id
  228. * @return 系统当前默认时区与指定时区的时间差.(单位:毫秒)
  229. */
  230. private static int getDiffTimeZoneRawOffset(String timeZoneId) {
  231. return TimeZone.getDefault().getRawOffset()
  232. - TimeZone.getTimeZone(timeZoneId).getRawOffset();
  233. }
  234.  
  235. /**
  236. * 将日期时间字符串根据转换为指定时区的日期时间.
  237. *
  238. * @param srcDateTime
  239. * 待转化的日期时间.
  240. * @param dstTimeZoneId
  241. * 目标的时区编号.
  242. *
  243. * @return 转化后的日期时间.
  244. * @see #string2Timezone(String, String, String, String)
  245. */
  246. public static String string2TimezoneDefault(String srcDateTime,
  247. String dstTimeZoneId) {
  248. return string2Timezone("yyyy-MM-dd HH:mm:ss", srcDateTime,
  249. "yyyy-MM-dd HH:mm:ss", dstTimeZoneId);
  250. }
  251.  
  252. }

本文转自:http://stephen830.iteye.com/blog/260343

java对世界各个时区(TimeZone)的通用转换处理方法的更多相关文章

  1. Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  2. java中字符数组与字符串之间互相转换的方法

    public static void main(String[] args) { //1.字符数组 转换成 字符串 //(1)直接在构造String时转换 char[] array = new cha ...

  3. JAVA中java.util.Date、java.sql.Timestamp和String之间的互相转换

    java.util.Date与的String互转 java.util.Date---->String /** * 将java.util.Date对象转化为String字符串 * @param d ...

  4. 新霸哥带你进入java的世界

    新霸哥从近期大家的留言中注意到了大家对基础知识比较重视,很多的朋友希望多讲一些入门的知识,为了满足广大开发爱好者的需求,新霸哥决定从最基础的做起,一点一点的帮助大家一起走进云计算的世界.下面新霸哥首先 ...

  5. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  6. Centos7 修改系统时区timezone

    Centos7 修改系统时区timezone 注意:修改Linux系统的时区以后,再安装jvm,jvm默认会使用系统的时区.如果系统时区设置错误,安装jvm后,再修改系统的时区,但jvm的时区仍然用不 ...

  7. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  8. Java中使用最频繁及最通用的Java工具类

    在Java中,工具类定义了一组公共方法,Java中使用最频繁及最通用的Java工具类. 一. org.apache.commons.io.IOUtils closeQuietly:关闭一个IO流.so ...

  9. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

随机推荐

  1. (翻译) Container Components

    react.js javascript   这篇文章翻译自Medium的一篇文章:Container Components 选择这篇文章翻译的原因是,在刚接触React的时候,这篇文章很好的指引我了解 ...

  2. WebRTC for android ios开发官方指南

    The WebRTC native code package can be found at: https://chromium.googlesource.com/external/webrtc ht ...

  3. 16 nginx实现负载均衡

    一:nginx实现负载均衡-----------------原理-------------------------- (1) 反向代理后端如果有多台服务器,自然可形成负载均衡,但proxy_pass如 ...

  4. Tinker 热修复框架 简单上手教程

    当你们看到Tinker的时候是不是有点愣逼这个是什么东西? 简单来说就是不需要重新下载app和重新安装app 来进行更新app的技术框架. 看看这个吧,我也是才学习 ,先做个学习记录 参考:Tinke ...

  5. 32.10 使用模板更改控件的UI

    32.10  使用模板更改控件的UI 样式是改变WPF控件基本外形的非常好(且非常简单)的方式,它通过为窗口部件的特性设置建立一组默认的值,从而改变WPF控件的基本外形.但是,即使样式允许我们改变各种 ...

  6. JBoss AS 7之域名直接訪问配置(The Return Of The King)

    1.6域名直接訪问配置 部署JBoss的时候,默认情况下訪问是须要加项目名字才可以訪问的. 可是怎样才可以"IP+port"訪问呢?以下将解说怎样配置. 配置域名訪问须要在项目以下 ...

  7. Java知识点梳理——常用方法总结

    1.查找字符串最后一次出现的位置 String str = "my name is zzw"; int lastIndex = str.lastIndexOf("zzw& ...

  8. php总结8——mysql函数库、增删改

    8.1 mysql函数库 php的函数   .php中用来操作mysql函数库的函数 常用函数 mysql_connect("主机名称/ip","用户名",&q ...

  9. Django项目高频使用文件

    数据库配置: MySQL数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost' ...

  10. 基础学习笔记之opencv(6):实现将图片生成视频

    基础学习笔记之opencv(6):实现将图片生成视频 在做实验的过程中.难免会读视频中的图片用来处理,相反将处理好的图片又整理输出为一个视频文件也是非经常常使用的. 以下就来讲讲基于opencv的C+ ...