关键词搜索

源码搜索 ×
×

Java日期函数转换和时区设置

发布2013-04-26浏览2031次

详情内容

前言:java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数,所以它是没有时区和Locale概念的。

java通过如下形式取得当前时间点:Date now = new Date(); //这个时间点与本地系统的时区无关

注意:在某些场景中使用字符串转时间转换成“yyyy-MM-dd HH:mm:ss”的Date类型是转换不成功的,一般推荐使用Calendar来转。

1、时间表达式格式化字符意义

字母

日期或时间元素

表示

示例

G

Era 标志符

Text

AD

y

Year

1996; 96

M

年中的月份

Month

July; Jul; 07

w

年中的周数

Number

27

W

月份中的周数

Number

2

D

年中的天数

Number

189

d

月份中的天数

Number

10

F

月份中的星期

Number

2

E

星期中的天数

Text

Tuesday; Tue

a

Am/pm 标记

Text

PM

H

一天中的小时数(0-23)

Number

0

k

一天中的小时数(1-24)

Number

24

K

am/pm 中的小时数(0-11)

Number

0

h

am/pm 中的小时数(1-12)

Number

12

m

小时中的分钟数

Number

30

s

分钟中的秒数

Number

55

S

毫秒数

Number

978

z

时区

General time zone

Pacific Standard Time; PST;GMT-08:00

Z

时区

RFC 822 time zone

-0800

2、时间转换工具类示例

  1. package com.boonya.date;
  2. import java.text.ParseException;
  3. import java.text.ParsePosition;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.GregorianCalendar;
  8. import java.util.Locale;
  9. import java.util.Random;
  10. import java.util.TimeZone;
  11. /**
  12. * 时间转换工具类
  13. * @author boonya
  14. * @version 1.0
  15. * 注释:Date是无时区时间类型
  16. */
  17. public class ParseDate {
  18. /**
  19. * 获取现在时间
  20. *
  21. * @return 返回时间类型 yyyy-MM-dd HH:mm:ss
  22. */
  23. public static Date getNowDate() {
  24. Date currentTime = new Date();
  25. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  26. String dateString = formatter.format(currentTime);
  27. ParsePosition pos = new ParsePosition(8);
  28. Date currentTime_2 = formatter.parse(dateString, pos);
  29. return currentTime_2;
  30. }
  31. /**
  32. * 获取现在时间
  33. *
  34. * @return返回短时间格式 yyyy-MM-dd
  35. */
  36. public static Date getNowDateShort() {
  37. Date currentTime = new Date();
  38. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  39. String dateString = formatter.format(currentTime);
  40. ParsePosition pos = new ParsePosition(8);
  41. Date currentTime_2 = formatter.parse(dateString, pos);
  42. return currentTime_2;
  43. }
  44. /**
  45. * 获取现在时间
  46. *
  47. * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
  48. */
  49. public static String getStringDate() {
  50. Date currentTime = new Date();
  51. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  52. String dateString = formatter.format(currentTime);
  53. return dateString;
  54. }
  55. /**
  56. * 获取现在时间
  57. *
  58. * @return 返回短时间字符串格式yyyy-MM-dd
  59. */
  60. public static String getStringDateShort() {
  61. Date currentTime = new Date();
  62. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  63. String dateString = formatter.format(currentTime);
  64. return dateString;
  65. }
  66. /**
  67. * 获取时间 小时:分;秒 HH:mm:ss
  68. *
  69. * @return
  70. */
  71. public static String getTimeShort() {
  72. SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
  73. Date currentTime = new Date();
  74. String dateString = formatter.format(currentTime);
  75. return dateString;
  76. }
  77. /**
  78. * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
  79. *
  80. * @param strDate
  81. * @return
  82. */
  83. public static Date strToDateLong(String strDate) {
  84. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  85. ParsePosition pos = new ParsePosition(0);
  86. Date strtodate = formatter.parse(strDate, pos);
  87. return strtodate;
  88. }
  89. /**
  90. * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
  91. *
  92. * @param dateDate
  93. * @return
  94. */
  95. public static String dateToStrLong(java.util.Date dateDate) {
  96. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  97. String dateString = formatter.format(dateDate);
  98. return dateString;
  99. }
  100. /**
  101. * 将短时间格式时间转换为字符串 yyyy-MM-dd
  102. *
  103. * @param dateDate
  104. * @param k
  105. * @return
  106. */
  107. public static String dateToStr(java.util.Date dateDate) {
  108. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  109. String dateString = formatter.format(dateDate);
  110. return dateString;
  111. }
  112. /**
  113. * 将短时间格式字符串转换为时间 yyyy-MM-dd
  114. *
  115. * @param strDate
  116. * @return
  117. */
  118. public static Date strToDate(String strDate) {
  119. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  120. ParsePosition pos = new ParsePosition(0);
  121. Date strtodate = formatter.parse(strDate, pos);
  122. return strtodate;
  123. }
  124. /**
  125. * 得到现在时间
  126. *
  127. * @return
  128. */
  129. public static Date getNow() {
  130. Date currentTime = new Date();
  131. return currentTime;
  132. }
  133. /**
  134. * 提取一个月中的最后一天
  135. *
  136. * @param day
  137. * @return
  138. */
  139. public static Date getLastDate(long day) {
  140. Date date = new Date();
  141. long date_3_hm = date.getTime() - 3600000 * 34 * day;
  142. Date date_3_hm_date = new Date(date_3_hm);
  143. return date_3_hm_date;
  144. }
  145. /**
  146. * 字符串时间通过Calendar转成Date类型
  147. *
  148. * @param date
  149. *
  150. * @param format
  151. * @return
  152. * @throws ParseException
  153. */
  154. public static Date parseStrToDateByCalendar(String date,String format) throws ParseException{
  155. SimpleDateFormat formatter = new SimpleDateFormat(format);
  156. Calendar calendar=Calendar.getInstance();
  157. calendar.setTime(formatter.parse(date));
  158. Date convertedDate=calendar.getTime();
  159. return convertedDate;
  160. }
  161. /**
  162. * 得到现在时间
  163. *
  164. * @return 字符串 yyyyMMdd HHmmss
  165. */
  166. public static String getStringToday() {
  167. Date currentTime = new Date();
  168. SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss");
  169. String dateString = formatter.format(currentTime);
  170. return dateString;
  171. }
  172. /**
  173. * 得到现在小时
  174. */
  175. public static String getHour() {
  176. Date currentTime = new Date();
  177. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  178. String dateString = formatter.format(currentTime);
  179. String hour;
  180. hour = dateString.substring(11, 13);
  181. return hour;
  182. }
  183. /**
  184. * 得到现在分钟
  185. *
  186. * @return
  187. */
  188. public static String getTime() {
  189. Date currentTime = new Date();
  190. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  191. String dateString = formatter.format(currentTime);
  192. String min;
  193. min = dateString.substring(14, 16);
  194. return min;
  195. }
  196. /**
  197. * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。
  198. *
  199. * @param sformat
  200. * yyyyMMddhhmmss
  201. * @return
  202. */
  203. public static String getUserDate(String sformat) {
  204. Date currentTime = new Date();
  205. SimpleDateFormat formatter = new SimpleDateFormat(sformat);
  206. String dateString = formatter.format(currentTime);
  207. return dateString;
  208. }
  209. /**
  210. * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟
  211. */
  212. public static String getTwoHour(String st1, String st2) {
  213. String[] kk = null;
  214. String[] jj = null;
  215. kk = st1.split(":");
  216. jj = st2.split(":");
  217. if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0]))
  218. return "0";
  219. else {
  220. double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1])
  221. / 60;
  222. double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1])
  223. / 60;
  224. if ((y - u) > 0)
  225. return y - u + "";
  226. else
  227. return "0";
  228. }
  229. }
  230. /**
  231. * 得到二个日期间的间隔天数
  232. */
  233. public static String getTwoDay(String sj1, String sj2) {
  234. SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
  235. long day = 0;
  236. try {
  237. java.util.Date date = myFormatter.parse(sj1);
  238. java.util.Date mydate = myFormatter.parse(sj2);
  239. day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
  240. } catch (Exception e) {
  241. return "";
  242. }
  243. return day + "";
  244. }
  245. /**
  246. * 时间前推或后推分钟,其中JJ表示分钟.
  247. */
  248. public static String getPreTime(String sj1, String jj) {
  249. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  250. String mydate1 = "";
  251. try {
  252. Date date1 = format.parse(sj1);
  253. long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60;
  254. date1.setTime(Time * 1000);
  255. mydate1 = format.format(date1);
  256. } catch (Exception e) {
  257. }
  258. return mydate1;
  259. }
  260. /**
  261. * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数
  262. */
  263. public static String getNextDay(String nowdate, String delay) {
  264. try {
  265. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  266. String mdate = "";
  267. Date d = strToDate(nowdate);
  268. long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24
  269. * 60 * 60;
  270. d.setTime(myTime * 1000);
  271. mdate = format.format(d);
  272. return mdate;
  273. } catch (Exception e) {
  274. return "";
  275. }
  276. }
  277. /**
  278. * 判断是否润年
  279. *
  280. * @param ddate
  281. * @return
  282. */
  283. public static boolean isLeapYear(String ddate) {
  284. /**
  285. * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
  286. * 3.能被4整除同时能被100整除则不是闰年
  287. */
  288. Date d = strToDate(ddate);
  289. GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
  290. gc.setTime(d);
  291. int year = gc.get(Calendar.YEAR);
  292. if ((year % 400) == 0)
  293. return true;
  294. else if ((year % 4) == 0) {
  295. if ((year % 100) == 0)
  296. return false;
  297. else
  298. return true;
  299. } else
  300. return false;
  301. }
  302. /**
  303. * 返回美国时间格式 26 Apr 2006
  304. *
  305. * @param str
  306. * @return
  307. */
  308. public static String getEDate(String str) {
  309. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  310. ParsePosition pos = new ParsePosition(0);
  311. Date strtodate = formatter.parse(str, pos);
  312. String j = strtodate.toString();
  313. String[] k = j.split(" ");
  314. return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
  315. }
  316. /**
  317. * 获取一个月的最后一天
  318. *
  319. * @param dat
  320. * @return
  321. */
  322. public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
  323. String str = dat.substring(0, 8);
  324. String month = dat.substring(5, 7);
  325. int mon = Integer.parseInt(month);
  326. if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8
  327. || mon == 10 || mon == 12) {
  328. str += "31";
  329. } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
  330. str += "30";
  331. } else {
  332. if (isLeapYear(dat)) {
  333. str += "https://files.jxasp.com/image/29";
  334. } else {
  335. str += "https://files.jxasp.com/image/28";
  336. }
  337. }
  338. return str;
  339. }
  340. /**
  341. * 判断二个时间是否在同一个周
  342. *
  343. * @param date1
  344. * @param date2
  345. * @return
  346. */
  347. public static boolean isSameWeekDates(Date date1, Date date2) {
  348. Calendar cal1 = Calendar.getInstance();
  349. Calendar cal2 = Calendar.getInstance();
  350. cal1.setTime(date1);
  351. cal2.setTime(date2);
  352. int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
  353. if (0 == subYear) {
  354. if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
  355. .get(Calendar.WEEK_OF_YEAR))
  356. return true;
  357. } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
  358. // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
  359. if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
  360. .get(Calendar.WEEK_OF_YEAR))
  361. return true;
  362. } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
  363. if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
  364. .get(Calendar.WEEK_OF_YEAR))
  365. return true;
  366. }
  367. return false;
  368. }
  369. /**
  370. * 产生周序列,即得到当前时间所在的年度是第几周
  371. *
  372. * @return
  373. */
  374. public static String getSeqWeek() {
  375. Calendar c = Calendar.getInstance(Locale.CHINA);
  376. String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
  377. if (week.length() == 1)
  378. week = "0" + week;
  379. String year = Integer.toString(c.get(Calendar.YEAR));
  380. return year + week;
  381. }
  382. /**
  383. * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号
  384. *
  385. * @param sdate
  386. * @param num
  387. * @return
  388. */
  389. public static String getWeek(String sdate, String num) {
  390. // 再转换为时间
  391. Date dd = ParseDate.strToDate(sdate);
  392. Calendar c = Calendar.getInstance();
  393. c.setTime(dd);
  394. if (num.equals("1")) // 返回星期一所在的日期
  395. c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
  396. else if (num.equals("https://files.jxasp.com/image/2")) // 返回星期二所在的日期
  397. c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
  398. else if (num.equals("3")) // 返回星期三所在的日期
  399. c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
  400. else if (num.equals("4")) // 返回星期四所在的日期
  401. c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
  402. else if (num.equals("5")) // 返回星期五所在的日期
  403. c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
  404. else if (num.equals("6")) // 返回星期六所在的日期
  405. c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
  406. else if (num.equals("0")) // 返回星期日所在的日期
  407. c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
  408. return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
  409. }
  410. /**
  411. * 根据一个日期,返回是星期几的字符串
  412. *
  413. * @param sdate
  414. * @return
  415. */
  416. public static String getWeek(String sdate) {
  417. // 再转换为时间
  418. Date date = ParseDate.strToDate(sdate);
  419. Calendar c = Calendar.getInstance();
  420. c.setTime(date);
  421. // int hour=c.get(Calendar.DAY_OF_WEEK);
  422. // hour中存的就是星期几了,其范围 1~7
  423. // 1=星期日 7=星期六,其他类推
  424. return new SimpleDateFormat("EEEE").format(c.getTime());
  425. }
  426. public static String getWeekStr(String sdate) {
  427. String str = "";
  428. str = ParseDate.getWeek(sdate);
  429. if ("1".equals(str)) {
  430. str = "星期日";
  431. } else if ("https://files.jxasp.com/image/2".equals(str)) {
  432. str = "星期一";
  433. } else if ("3".equals(str)) {
  434. str = "星期二";
  435. } else if ("4".equals(str)) {
  436. str = "星期三";
  437. } else if ("5".equals(str)) {
  438. str = "星期四";
  439. } else if ("6".equals(str)) {
  440. str = "星期五";
  441. } else if ("7".equals(str)) {
  442. str = "星期六";
  443. }
  444. return str;
  445. }
  446. /**
  447. * 两个时间之间的天数
  448. *
  449. * @param date1
  450. * @param date2
  451. * @return
  452. */
  453. public static long getDays(String date1, String date2) {
  454. if (date1 == null || date1.equals(""))
  455. return 0;
  456. if (date2 == null || date2.equals(""))
  457. return 0;
  458. // 转换为标准时间
  459. SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
  460. java.util.Date date = null;
  461. java.util.Date mydate = null;
  462. try {
  463. date = myFormatter.parse(date1);
  464. mydate = myFormatter.parse(date2);
  465. } catch (Exception e) {
  466. }
  467. long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
  468. return day;
  469. }
  470. /**
  471. * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间
  472. * 此函数返回该日历第一行星期日所在的日期
  473. *
  474. * @param sdate
  475. * @return
  476. */
  477. public static String getNowMonth(String sdate) {
  478. // 取该时间所在月的一号
  479. sdate = sdate.substring(0, 8) + "01";
  480. // 得到这个月的1号是星期几
  481. Date date = ParseDate.strToDate(sdate);
  482. Calendar c = Calendar.getInstance();
  483. c.setTime(date);
  484. int u = c.get(Calendar.DAY_OF_WEEK);
  485. String newday = ParseDate.getNextDay(sdate, (1 - u) + "");
  486. return newday;
  487. }
  488. /**
  489. * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数
  490. *
  491. * @param k
  492. * 表示是取几位随机数,可以自己定
  493. */
  494. public static String getNo(int k) {
  495. return getUserDate("yyyyMMddhhmmss") + getRandom(k);
  496. }
  497. /**
  498. * 返回一个随机数
  499. *
  500. * @param i
  501. * @return
  502. */
  503. public static String getRandom(int i) {
  504. Random jjj = new Random();
  505. // int suiJiShu = jjj.nextInt(9);
  506. if (i == 0)
  507. return "";
  508. String jj = "";
  509. for (int k = 0; k < i; k++) {
  510. jj = jj + jjj.nextInt(9);
  511. }
  512. return jj;
  513. }
  514. /**
  515. * 判定字符串是否是预期的时间格式
  516. *
  517. * @param args
  518. */
  519. public static boolean RightDate(String date) {
  520. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  521. if (date == null)
  522. return false;
  523. if (date.length() > 10) {
  524. sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  525. } else {
  526. sdf = new SimpleDateFormat("yyyy-MM-dd");
  527. }
  528. try {
  529. sdf.parse(date);
  530. } catch (ParseException pe) {
  531. return false;
  532. }
  533. return true;
  534. }
  535. /**
  536.  * 获取更改时区后的日期
  537.  * @param date 日期
  538.  * @param oldZone 旧时区对象
  539.  * @param newZone 新时区对象
  540.  * @return 日期
  541.  */
  542. public static Date changeTimeZone(Date date, TimeZone oldZone, TimeZone newZone){
  543. Date dateTmp = null;
  544. if (date != null) {
  545. int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();
  546. dateTmp = new Date(date.getTime() - timeOffset);
  547. }
  548. return dateTmp;
  549. }
  550. /**
  551. * 函数入口
  552. * @param args
  553. * @throws Exception
  554. */
  555. public static void main(String[] args) throws Exception {
  556. Date date0=ParseDate.strToDate("https://files.jxasp.com/image/2013-04-26 00:00:00");
  557. Date date1=ParseDate.strToDateLong("https://files.jxasp.com/image/2013-04-26 17:23:09");
  558. System.out.println(date0);
  559. System.out.println(date1);
  560. }
  561. }

3、时区设置

1)、SimpleDateFormat 取得本地系统的时区:

我的时区为"GMT+8"代表北京时区,然后按照pattern("yyyy-MM-dd HH:mm:ss")格式化date,此时输出的就是GMT+8区的时间了。如果想支持国际化时间,需要先指定时区,然后再格式化date数据。例如:

  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2. sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  3. String snow = sdf.format(date); // 2009-11-19 14:12:23

 

另外,你可以通过如下代码修改本地时区信息:

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

2)、Calendar也可以设置时区

如:Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载