java 时区 时间转换_java对世界各个时区(TimeZone)的通用转换处理方法(转载)

01./*

02. * Created on 2005-6-10

03. * Author stephen

04. * Email zhoujianqiang AT gmail DOT com

05. * CopyRight(C)2005-2008 , All rights reserved.

06. */

07.package com.soft4j.utility;

08.

09.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. *

21. * 日期(时间)的常用格式(formater)主要有:

22. * yyyy-MM-dd HH:mm:ss

23. *

24. * @author stephen

25. * @version 1.0.0

26. */

27.public final class DateTool {

28.

29. /**

30. * 对日期(时间)中的日进行加减计算.

31. * 例子:

32. * 如果Date类型的d为 2005年8月20日,那么

33. * calculateByDate(d,-10)的值为2005年8月10日

34. * 而calculateByDate(d,+10)的值为2005年8月30日

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参数指定的日期成员进行加减计算.

56. * 例子:

57. * 如果Date类型的d为 2005年8月20日,那么

58. * calculate(d,GregorianCalendar.YEAR,-10)的值为1995年8月20日

59. * 而calculate(d,GregorianCalendar.YEAR,+10)的值为2015年8月20日

60. *

61. * @param d

62. * 日期(时间).

63. * @param field

64. * 日期成员.

65. * 日期成员主要有:

66. * 年:GregorianCalendar.YEAR

67. * 月:GregorianCalendar.MONTH

68. * 日:GregorianCalendar.DATE

69. * 时:GregorianCalendar.HOUR

70. * 分:GregorianCalendar.MINUTE

71. * 秒:GregorianCalendar.SECOND

72. * 毫秒:GregorianCalendar.MILLISECOND

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. *
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. /**

128. * 获取所有的时区编号.

129. * 排序规则:按照ASCII字符的正序进行排序.

130. * 排序时候忽略字符大小写.

131. *

132. * @return 所有的时区编号(时区编号已经按照字符[忽略大小写]排序).

133. */

134. public static String[] fecthAllTimeZoneIds() {

135. Vector v = new Vector();

136. String[] ids = TimeZone.getAvailableIDs();

137. for (int i = 0; i < ids.length; i++) {

138. v.add(ids[i]);

139. }

140. java.util.Collections.sort(v, String.CASE_INSENSITIVE_ORDER);

141. v.copyInto(ids);

142. v = null;

143. return ids;

144. }

145.

146. /**

147. * 测试的main方法.

148. *

149. * @param argc

150. */

151. public static void main(String[] argc) {

152.

153. String[] ids = fecthAllTimeZoneIds();

154. String nowDateTime =date2String("yyyy-MM-dd HH:mm:ss");

155. System.out.println("The time Asia/Shanhai is " + nowDateTime);//程序本地运行所在时区为[Asia/Shanhai]

156. //显示世界每个时区当前的实际时间

157. for(int i=0;i

158. System.out.println(" * " + ids[i] + "=" + string2TimezoneDefault(nowDateTime,ids[i]));

159. }

160. //显示程序运行所在地的时区

161. System.out.println("TimeZone.getDefault().getID()=" +TimeZone.getDefault().getID());

162. }

163.

164. /**

165. * 将日期时间字符串根据转换为指定时区的日期时间.

166. *

167. * @param srcFormater

168. * 待转化的日期时间的格式.

169. * @param srcDateTime

170. * 待转化的日期时间.

171. * @param dstFormater

172. * 目标的日期时间的格式.

173. * @param dstTimeZoneId

174. * 目标的时区编号.

175. *

176. * @return 转化后的日期时间.

177. */

178. public static String string2Timezone(String srcFormater,

179. String srcDateTime, String dstFormater, String dstTimeZoneId) {

180. if (srcFormater == null || "".equals(srcFormater))

181. return null;

182. if (srcDateTime == null || "".equals(srcDateTime))

183. return null;

184. if (dstFormater == null || "".equals(dstFormater))

185. return null;

186. if (dstTimeZoneId == null || "".equals(dstTimeZoneId))

187. return null;

188. SimpleDateFormat sdf = new SimpleDateFormat(srcFormater);

189. try {

190. int diffTime = getDiffTimeZoneRawOffset(dstTimeZoneId);

191. Date d = sdf.parse(srcDateTime);

192. long nowTime = d.getTime();

193. long newNowTime = nowTime - diffTime;

194. d = new Date(newNowTime);

195. return date2String(dstFormater, d);

196. } catch (ParseException e) {

197. Log.output(e.toString(), Log.STD_ERR);

198. return null;

199. } finally {

200. sdf = null;

201. }

202. }

203.

204. /**

205. * 获取系统当前默认时区与UTC的时间差.(单位:毫秒)

206. *

207. * @return 系统当前默认时区与UTC的时间差.(单位:毫秒)

208. */

209. private static int getDefaultTimeZoneRawOffset() {

210. return TimeZone.getDefault().getRawOffset();

211. }

212.

213. /**

214. * 获取指定时区与UTC的时间差.(单位:毫秒)

215. *

216. * @param timeZoneId

217. * 时区Id

218. * @return 指定时区与UTC的时间差.(单位:毫秒)

219. */

220. private static int getTimeZoneRawOffset(String timeZoneId) {

221. return TimeZone.getTimeZone(timeZoneId).getRawOffset();

222. }

223.

224. /**

225. * 获取系统当前默认时区与指定时区的时间差.(单位:毫秒)

226. *

227. * @param timeZoneId

228. * 时区Id

229. * @return 系统当前默认时区与指定时区的时间差.(单位:毫秒)

230. */

231. private static int getDiffTimeZoneRawOffset(String timeZoneId) {

232. return TimeZone.getDefault().getRawOffset()

233. - TimeZone.getTimeZone(timeZoneId).getRawOffset();

234. }

235.

236. /**

237. * 将日期时间字符串根据转换为指定时区的日期时间.

238. *

239. * @param srcDateTime

240. * 待转化的日期时间.

241. * @param dstTimeZoneId

242. * 目标的时区编号.

243. *

244. * @return 转化后的日期时间.

245. * @see #string2Timezone(String, String, String, String)

246. */

247. public static String string2TimezoneDefault(String srcDateTime,

248. String dstTimeZoneId) {

249. return string2Timezone("yyyy-MM-dd HH:mm:ss", srcDateTime,

250. "yyyy-MM-dd HH:mm:ss", dstTimeZoneId);

251. }

252.

253.}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java世界不同时区之间时间转换提供了非常方便的处理方法。主要的处理类是`java.util.TimeZone`和`java.util.Calendar`。 首先,通过`TimeZone`类可以获取世界上所有的时区列表,可以通过`getAvailableIDs()`方法来获取,返回一个包含所有时区ID的字符串数组。 然后,可以通过`TimeZone.getTimeZone(String)`方法来获取指定时区的`TimeZone`对象。这个方法接受一个时区ID作为参数,并返回对应的`TimeZone`对象。 接下来,使用`Calendar`类来进行时间转换操作。`Calendar`类提供了许多方法,可以方便地进行日期和时间的计算、设置和获取。可以通过`Calendar.getInstance(TimeZone)`方法获取指定时区的`Calendar`实例。 对于时间转换,可以使用以下方法: - `setTimeZone(TimeZone)`:设置`Calendar`的时区。 - `get(int field)`:获取指定字段的值,例如年、月、日、小时、分钟等。 - `set(int field, int value)`:设置指定字段的值,例如年、月、日、小时、分钟等。 - `add(int field, int amount)`:增加或减少指定字段的值,例如增加一天、减少一小时等。 - `getTime()`:将`Calendar`对象转换为`Date`对象。 - `setTime(Date)`:将`Date`对象转换为`Calendar`对象。 通过这些方法,可以在不同时区间进行时间转换计算。可以根据不同的需求,在不同的场景下使用这些方法处理世界不同时区之间时间转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值