在开发过程中,少不了与时间打交道,比如根据两个日期得出相差的时分秒,时间加减,时间累加,前5分钟,前一个月,前一年,等等...


而我最近开发和时间操作的比较频繁,所以记录下,和时间操作有关的代码。


在JAVA中有六个与时间有关的类:


1. java.util.Date  
2. java.sql.Date    
3. java.sql.Time    
4. java.sql.Timestamp  
5. java.text.SimpleDateFormat  
6. java.util.Calendar



常用的也就是下面的几个:


1. Date:          getTime() 、setTime()  
2. DateFormat:           getInstance()、getDateInstance()、getDateTimeInstance()、getTimeInstance()  
3. SimpleDateFormate:    Formate(Date)、 parse(String s)  
4. Calendar:        getInstance()、set() 、get()、getActualMaximum()、add()、gettime()、setTime(Date)


下面分别对他们介绍下:


(1)、java.util.Date 


java.util.Date 是java.sqlDate,Time,Timestamp的父类,Java中的时间使用标准类库的java.util.Date,其表示特定的瞬间,精确到毫秒。是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。因为Date的设计具有"千年虫"以及"时区"的问题,所以Date中的大部分方法已经不建议使用了,它们都被java.util.Calendar类所取代


(2)、java.text.DateFormat(抽象类) 

       DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年1 月 1 日 00:00:00 这一刻开始的毫秒数。 不过DateFormat的格式化Date的功能有限,没有SimpleDateFormat强大;但DateFormat是SimpleDateFormat的父类。

(3)、java.text.SimpleDateFormat  (DateFormat的直接子类) 


 SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。

       SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。 


日期格式字符串如下:


JAVA中关于获取时间(日期)的总结大全_System


常见的转换有两种:


将Date格式化为String    String format(Date d)
将String解析为Date    Date   parse(String s)


(4)、java.util.Calendar(抽象类) 


对时间分量进行运算。

       Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

 
       与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。 
  


二、示例


大概可以分为以下五大类:


(A)、日期取值


1.1、获取当前系统时间(毫秒数)


1. //方式一  
2. Date date = new
3. System.out.println(date.getTime());  
4.   
5. //方式二  
6. System.out.println(System.currentTimeMillis());  
7.   
8. //转换成指定的格式  
9. String current = df.format(System.currentTimeMillis());  
10. System.out.println(current);         
11.   
12.   
13. 输出如下:  
14. 1513749728479  
15. 1513749728480  
16. 2017-12-20 14:02:08


(B)、日期转换


2.1、日期转字符串、字符串转日期

1. SimpleDateFormat sdf = new
2. try {  
3.     //1、日期转字符串  
4. calendar = Calendar.getInstance();  
5. date = calendar.getTime();  
6. dateStringParse = sdf.format(date);  
7.     System.out.println(dateStringParse);  
8.     //2、字符串转日期  
9. dateString = "2017-12-20 14:02:08";  
10. dateParse = sdf.parse(dateString);  
11.     System.out.println(dateParse);  
12. } catch (ParseException e) {  
13.     e.printStackTrace();  
14. }



注意:

-创建 SimpleDateFormat 对象时必须指定转换格式。
-转换格式区分大小写,yyyy 代表年份,MM 代表月份,dd 代表日期,HH 代表 24 进制的小时,hh 代表 12 进制的小时,mm 代表分钟,ss 代表秒。


2.2、将日期转换成中文年月日时分秒


1. SimpleDateFormat sdf = new
2. try {  
3. date = new
4. dateStringParse = sdf.format(date);  
5.     System.out.println(dateStringParse);  
6. } catch (Exception e) {  
7.     e.printStackTrace();  
8. }


2.3、将指定日期转换成带周的格式



1. DateFormat df = new
2. Date d1 = df.parse("2017-12-20 12:19:19");  
3. //指定日期  
4. Calendar cal = df.getCalendar();  
5. //当前时间  
6. Calendar cas = Calendar.getInstance();  
7. int year = cal.get(Calendar.YEAR);//获取年份  
8. int month=cal.get(Calendar.MONTH);//获取月份  
9. int day=cal.get(Calendar.DATE);//获取日  
10. int hour=cal.get(Calendar.HOUR);//小时  
11. int minute=cal.get(Calendar.MINUTE);//分  
12. int second=cal.get(Calendar.SECOND);//秒  
13. int WeekOfYear = cal.get(Calendar.DAY_OF_WEEK);//一周的第几天  
14. System.out.println("现在的时间是:公元"+year+"年"+month+"月"+day+"日      "+hour+"时"+minute+"分"+second+"秒     星期"+WeekOfYear);



2.4、获取当前时间显示,上午,下午


1. Date date = new
2. DateFormat df1 = DateFormat.getDateInstance();//日期格式,精确到日  
3. System.out.println(df1.format(date));  
4. DateFormat df2 = DateFormat.getDateTimeInstance();//可以精确到时分秒  
5. System.out.println(df2.format(date));  
6. DateFormat df3 = DateFormat.getTimeInstance();//只显示出时分秒  
7. System.out.println("只显示出时分秒:"+df3.format(date));  
8. DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL); //显示日期,周,上下午,时间(精确到秒)  
9. System.out.println("显示日期,周,上下午,时间(精确到秒):"+df4.format(date));  
10. DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG); //显示日期,上下午,时间(精确到秒)  
11. System.out.println("显示日期,上下午,时间(精确到秒):"+df5.format(date));  
12. DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT); //显示日期,上下午,时间(精确到分)  
13. System.out.println("显示日期,上下午,时间(精确到分):"+df6.format(date));  
14. DateFormat df7 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM); //显示日期,时间(精确到分)  
15. System.out.println("显示日期,时间(精确到分):"+df7.format(date));



2.5、时间秒转化为多少天小时分秒


1. /**    
2.      * 秒转化为天小时分秒字符串    
3.      *    
4.      * @param seconds    
5.      * @return String    
6.      */      
7.     public static String formatSeconds(long seconds) {      
8. timeStr = seconds
9. >
10. second = seconds
11. min = seconds
12. timeStr = min
13. >
14. min
15. hour
16. timeStr = hour
17. >
18. hour
19. day
20. timeStr = day
21.                 }      
22.             }      
23.         }      
24.         return timeStr;      
25.  }






(C)、设置时间


Calendar.getInstance().getTime()即可获取一个Date对象
Calendar.getInstance().add(时间的一个部分,正数代表加,负数代表减)


推荐 使用java.util.Calendar类来进行操作,因为java.util.Date类很多方法都过时了,Calendar 类有很多重载的设置时间的方法,可以针对于某一项进行设置,也可以同时进行很多设置




1. set(int field, int value) 将给定的日历字段设置为给定值。  
2. void    set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。  
3. void    set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。  
4. void    set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。



第一个就是给特定的字段设值,后面三个就是针对多个字段赋值



(D)、日期加减


通常来说,我们会对日期做两种加减操作:

一、以某个日期为基准,计算其几天前/后、几年前/后,或者其他时间单位前后的日期


A、获取当前时间的前一年时间



1. //根据现在时间计算  
2. Calendar now = Calendar.getInstance();  
3. now.add(Calendar.YEAR, 1); //现在时间是1年后  
4. print(now);  
5. now.add(Calendar.YEAR, -1); //现在时间是1年前  
6. print(now);  
7.   
8. //根据某个特定的时间 date (Date 型) 计算  
9. Calendar specialDate = Calendar.getInstance();  
10. specialDate.setTime(new Date()); //注意在此处将 specialDate 的值改为特定日期  
11. specialDate.add(Calendar.YEAR, 1); //特定时间的1年后  
12. print(specialDate);  
13. specialDate.add(Calendar.YEAR, -1); //特定时间的1年前  
14. print(specialDate);



打印Calendar的方法为:




1. public void print(Calendar specialDate){  
2.     System.out.println(specialDate.get(Calendar.YEAR)+"年"+(specialDate.get(Calendar.MONTH)+1)+  
3.             "月"+specialDate.get(Calendar.DAY_OF_MONTH)+"日"+specialDate.get(Calendar.HOUR_OF_DAY)+  
4.             ":"+specialDate.get(Calendar.MINUTE)+":"+specialDate.get(Calendar.SECOND));  
5. }



使用了 Calendar 对象的 add 方法,可以更改 Calendar.YEAR 为任意时间单位字段,完成各种时间单位下的日期计算。


B、根据时间然后对小时,分钟,秒数进行相加




1. //取当前的时分-30  
2. SimpleDateFormat df = new
3. Calendar nowTime2 = Calendar.getInstance();  
4. nowTime2.add(Calendar.MINUTE, -30);//30分钟前的时间  
5. String currentTime = df.format(nowTime2.getTime());  
6. System.out.println("30分钟前的时间" + currentTime);  
7.   
8. //取当前小时减一个小时  
9. Calendar calendar = Calendar.getInstance();  
10. calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);  
11. SimpleDateFormat dff = new
12. System.out.println("一个小时前的时间:" + dff.format(calendar.getTime()));  
13. System.out.println("当前的时间:" + dff.format(new Date()));  
14.   
15. //取当前的时分+5  
16. Calendar nowTime = Calendar.getInstance();  
17. nowTime.add(Calendar.MINUTE, 5);  
18. String currentTimes = df.format(nowTime.getTime());  
19. System.out.println("当前时间加5分钟" +currentTimes);  
20.   
21. //前一天的时间  
22. Date dNow = new
23. Calendar calendars = Calendar.getInstance(); //得到日历  
24. calendars.setTime(dNow);//把当前时间赋给日历  
25. calendars.add(Calendar.DAY_OF_MONTH, -1);  //设置为前一天  
26. Date dBefore = calendars.getTime();   //得到前一天的时间  
27.   
28. String defaultStartDate = df.format(dBefore);    //格式化前一天  
29. String defaultEndDate = df.format(dNow); //格式化当前时间  
30.   
31. System.out.println("前一天的时间是:" + defaultStartDate);  
32. System.out.println("生成的时间是:" + defaultEndDate);



C、对时分秒进行累计,比如说视频通话,第一次,通了10分钟,第二次就得把上次的时间进行累计。



1. DateFormat df = new
2. //上次挂断电话时间  
3. Date d1 = df.parse("2017-12-20 12:19:19");  
4. //这次通话时长  
5. Date d2 = df.parse("2017-12-20 11:40:34");  
6. long nd = 1000
7. long nh = 1000
8. long nm = 1000
9. long ns = 1000;  
10. // 获得两个时间的毫秒时间差异  
11. long diff = d1.getTime() - d2.getTime();  
12. // 计算差多少天  
13. long day = diff
14. // 计算差多少小时  
15. long hour = diff
16. // 计算差多少分钟  
17. long min = diff
18. // 计算差多少秒/输出结果  
19. long sec = diff
20. //根据上次挂断电话时间然后得出这次通话时长  
21. System.out.println(day + "天" + hour + "小时" + min + "分钟"+ sec + "秒");  
22.   
23. //累计通话时长  
24. String cur = "10:15:12";  
25. SimpleDateFormat myFormatter = new
26. Calendar cal = Calendar.getInstance();  
27. cal.setTime(myFormatter.parse(cur));  
28. int shi
29. int fendo
30. int miao
31.   
32. //以下算法有些问题  
33. if(miao>60){  
34. miao=00;  
35. >60){  
36. fendo = 00;  
37. shi = shi+1;  
38.     }else {  
39. fendo = fendo
40.     }  
41. }  
42. System.out.println(shi+":"+fendo+":"+miao);




二、计算两个时间的间隔


A、例如计算 2017 年 1 月 1 日距离现在有多少天。  


1. SimpleDateFormat sdf = new
2. String dateString = "2017-01-01 11:11:11";  
3. Calendar calendar = Calendar.getInstance();  
4. long nowDate = calendar.getTime().getTime(); //Date.getTime() 获得毫秒型日期  
5. try {  
6. specialDate = sdf.parse(dateString).getTime();  
7. betweenDate
8.     System.out.print(betweenDate);  
9. } catch (ParseException e) {  
10.     e.printStackTrace();  
11. }




B、求出两个日期相差多少小时,分钟,毫秒


1. DateFormat df = new
2. Date d1 = df.parse("2017-12-20 12:19:19");  
3. Date d2 = df.parse("2017-12-20 11:40:34");  
4. long nd = 1000
5. long nh = 1000
6. long nm = 1000
7. long ns = 1000;  
8. // 获得两个时间的毫秒时间差异  
9. long diff = d1.getTime() - d2.getTime();  
10. // 计算差多少天  
11. long day = diff
12. // 计算差多少小时  
13. long hour = diff
14. // 计算差多少分钟  
15. long min = diff
16. // 计算差多少秒//输出结果  
17. long sec = diff
18. System.out.println(day + "天" + hour + "小时" + min + "分钟"+ sec + "秒");




(E)、日期比较


日期比较一般有两种方法,对于 java.util.Date 或者 java.util.Calendar 都是通用的。一种是通过 after() 与 before() 方法进行比较,一种是通过 compareTo() 方法进行比较。


1. SimpleDateFormat sdf = new
2. String dateString_01 = "2017-12-20 11:11:11";  
3. String dateString_02 = "2017-12-21 11:11:11";  
4. try {  
5. date_01 = sdf.parse(dateString_01);  
6. date_02 = sdf.parse(dateString_02);  
7.     System.out.println(date_01.before(date_02)); //true,当 date_01 小于 date_02 时,为 true,否则为 false  
8.     System.out.println(date_02.after(date_01)); //true,当 date_02 大于 date_01 时,为 true,否则为 false  
9.     System.out.println(date_01.compareTo(date_02)); //-1,当 date_01 小于 date_02 时,为 -1  
10.     System.out.println(date_02.compareTo(date_01)); //1,当 date_02 大于 date_01 时,为 1  
11.     System.out.println(date_02.compareTo(date_02)); //0,当两个日期相等时,为 0  
12. } catch (ParseException e) {  
13.     e.printStackTrace();  
14. }




三、工具类




网上找的一个工具类:


1. /**  
2.  * projectName: xxxx  
3.  * fileName: DateUtil.java  
4.  * packageName: test  
5.  * date: 2017-12-20 15:36  
6.  * copyright(c) 2017-2020 xxx公司  
7.  */  
8. package test;  
9.   
10. import java.sql.Timestamp;  
11. import java.text.ParseException;  
12. import java.text.ParsePosition;  
13. import java.text.SimpleDateFormat;  
14. import java.util.*;  
15.   
16. /**  
17.  * @version: V1.0  
18.  * @author: fendo  
19.  * @className: DateUtil  
20.  * @packageName: test  
21.  * @description: 时间操作工具类  
22.  * @data: 2017-12-20 15:36  
23.  **/  
24. public class DateUtil {  
25.   
26. pattern="yyyy-MM-dd";  
27. formatter = new
28. formatter2 = new
29.   
30.     /**  
31.      * 获取现在时间  
32.      *  
33.      * @return 返回时间类型 yyyy-MM-dd HH:mm:ss  
34.      */  
35.     public static Date getNowDate() {  
36. formatter = new
37. dateString = formatter.format(new Date());  
38. pos = new
39. currentTime_2 = formatter.parse(dateString, pos);  
40.         return currentTime_2;  
41.     }  
42.   
43.     /**  
44.      * 获取现在时间  
45.      *  
46.      * @return返回短时间格式 yyyy-MM-dd  
47.      */  
48.     public static Date getNowDateShort() {  
49. dateString = formatter.format(new Date());  
50. pos = new
51. currentTime_2 = formatter.parse(dateString, pos);  
52.         return currentTime_2;  
53.     }  
54.   
55.     /**  
56.      * 获取现在时间  
57.      *  
58.      * @return返回字符串格式 yyyy-MM-dd HH:mm:ss  
59.      */  
60.     public static String getStringDate() {  
61. formatter = new
62. dateString = formatter.format(new Date());  
63.         return dateString;  
64.     }  
65.     /**  
66.      * 获取现在时间  
67.      * @return返回字符串格式 yyyyMMddHHmmss  
68.      */  
69.     public static String getStringAllDate() {  
70. formatter = new
71. dateString = formatter.format(new Date());  
72.         return dateString;  
73.     }  
74.     /**  
75.      * 获取现在时间  
76.      *  
77.      * @return 返回短时间字符串格式yyyy-MM-dd  
78.      */  
79.     public static String getStringDateShort() {  
80. dateString = formatter.format( new Date());  
81.         return dateString;  
82.     }  
83.   
84.     /**  
85.      * 获取时间 小时:分;秒 HH:mm:ss  
86.      *  
87.      * @return  
88.      */  
89.     public static String getTimeShort() {  
90. formatter = new
91. dateString = formatter.format(new Date());  
92.         return dateString;  
93.     }  
94.   
95.     /**  
96.      * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss  
97.      *  
98.      * @param strDate  
99.      * @return  
100.      */  
101.     public static Date strToDateLong(String strDate) {  
102. formatter = new
103. pos = new
104. strtodate = formatter.parse(strDate, pos);  
105.         return strtodate;  
106.     }  
107.   
108.     /**  
109.      * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss  
110.      *  
111.      * @param dateDate  
112.      * @return  
113.      */  
114.     public static String dateToStrLong(java.util.Date dateDate) {  
115. formatter = new
116. dateString = formatter.format(dateDate);  
117.         return dateString;  
118.     }  
119.   
120.     /**  
121.      * 将短时间格式时间转换为字符串 yyyy-MM-dd  
122.      *  
123.      * @param dateDate  
124.      * @return  
125.      */  
126.     public static String dateToStr(Date dateDate) {  
127. dateString = formatter.format(dateDate);  
128.         return dateString;  
129.     }  
130.   
131.   
132.     /**  
133.      * 将短时间格式字符串转换为时间 yyyy-MM-dd  
134.      *  
135.      * @param strDate  
136.      * @return  
137.      */  
138.     public static Date strToDate(String strDate) {  
139. pos = new
140. strtodate = formatter.parse(strDate, pos);  
141.         return strtodate;  
142.     }  
143.   
144.     /**  
145.      * 将短时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss  
146.      *  
147.      * @param strDate  
148.      * @return  
149.      */  
150.     public static Timestamp strToDateSql(String strDate) {  
151. pos = new
152. strtodate = formatter2.parse(strDate, pos);  
153.         return new Timestamp(strtodate.getTime());  
154.     }  
155.     /**  
156.      * 得到现在时间  
157.      *  
158.      * @return  
159.      */  
160.     public static Date getNow() {  
161. currentTime = new
162.         return currentTime;  
163.     }  
164.   
165.     /**  
166.      * 提取一个月中的最后一天  
167.      *  
168.      * @param day  
169.      * @return  
170.      */  
171.     public static Date getLastDate(long day) {  
172. date = new
173. date_3_hm = date.getTime() - 3600000 * 34 * day;  
174. date_3_hm_date = new
175.         return date_3_hm_date;  
176.     }  
177.   
178.     /**  
179.      * 得到现在时间  
180.      *  
181.      * @return 字符串 yyyyMMdd HHmmss  
182.      */  
183.     public static String getStringToday() {  
184. currentTime = new
185. formatter = new
186. dateString = formatter.format(currentTime);  
187.         return dateString;  
188.     }  
189.     /**  
190.      *  
191. <br/>
192.      *  
193.      * @author Tony  
194. <br/>
195.      */  
196.     public static String getTodayShort() {  
197. currentTime = new
198. formatter = new
199. dateString = formatter.format(currentTime);  
200.         return dateString;  
201.     }  
202.     /**  
203.      *  
204.      * @Description: 输入一个整数类型的字符串,然后转换成时分秒的形式输出  
205.      *    例如:输入568  
206.      *          返回结果为:00:09:28  
207.      *          输入null或者“”  
208.      *          返回结果为:00:00:00  
209.      * @param @param value  
210.      * @param @return  
211.      * @return String  
212.      * @throws  
213.      * @author Tony 鬼手卡卡  
214.      * @date 2016-4-20  
215.      */  
216.     public static String getHHMMSS(String value){  
217. hour="00";  
218. minute="00";  
219. second="00";  
220.         if(value!=null&&!value.trim().equals("")){  
221. v_int=Integer.valueOf(value);  
222. hour=v_int/3600+"";//获得小时;  
223. minute=v_int%3600/60+"";//获得小时;  
224. second=v_int%3600%60+"";//获得小时;  
225.         }  
226. >1?hour:"0"+hour)+":"+(minute.length()>1?minute:"0"+minute)+":"+(second.length()>1?second:"0"+second);  
227.     }  
228.     /**  
229.      * 得到现在小时  
230.      */  
231.     public static String getHour() {  
232. currentTime = new
233. formatter = new
234. dateString = formatter.format(currentTime);  
235.         String hour;  
236. hour = dateString.substring(11, 13);  
237.         return hour;  
238.     }  
239.   
240.     /**  
241.      * 得到现在分钟  
242.      *  
243.      * @return  
244.      */  
245.     public static String getTime() {  
246. currentTime = new
247. formatter = new
248. dateString = formatter.format(currentTime);  
249.         String min;  
250. min = dateString.substring(14, 16);  
251.         return min;  
252.     }  
253.   
254.     /**  
255.      * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。  
256.      *  
257.      * @param sformat  
258.      *            yyyyMMddhhmmss  
259.      * @return  
260.      */  
261.     public static String getUserDate(String sformat) {  
262. currentTime = new
263. formatter = new
264. dateString = formatter.format(currentTime);  
265.         return dateString;  
266.     }  
267.   
268.     /**  
269.      * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟  
270.      */  
271.     public static String getTwoHour(String st1, String st2) {  
272. kk = null;  
273. jj = null;  
274. kk = st1.split(":");  
275. jj = st2.split(":");  
276. < Integer.parseInt(jj[0]))  
277.             return "0";  
278.         else {  
279. y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60;  
280. u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60;  
281. >
282.                 return y - u + "";  
283.             else  
284.                 return "0";  
285.         }  
286.     }  
287.   
288.     /**  
289.      * 得到二个日期间的间隔天数  
290.      */  
291.     public static String getTwoDay(String sj1, String sj2) {  
292. day = 0;  
293.         try {  
294. date = formatter.parse(sj1);  
295. mydate = formatter.parse(sj2);  
296. day
297.         } catch (Exception e) {  
298.             return "";  
299.         }  
300.         return day + "";  
301.     }  
302.   
303.     /**  
304.      * 时间前推或后推分钟,其中JJ表示分钟.  
305.      */  
306.     public static String getPreTime(String sj1, String jj) {  
307. format = new
308. mydate1 = "";  
309.         try {  
310. date1 = format.parse(sj1);  
311. Time
312.             date1.setTime(Time * 1000);  
313. mydate1 = format.format(date1);  
314.         } catch (Exception e) {  
315.         }  
316.         return mydate1;  
317.     }  
318.   
319.     /**  
320.      * 得到一个时间延后或前移几天的时间,nowdate(yyyy-mm-dd)为时间,delay为前移或后延的天数  
321.      */  
322.     public static String getNextDay(String nowdate, String delay) {  
323.         try{  
324. mdate = "";  
325. d = strToDate(nowdate);  
326. myTime
327.             d.setTime(myTime * 1000);  
328. mdate = formatter.format(d);  
329.             return mdate;  
330.         }catch(Exception e){  
331.             return "";  
332.         }  
333.     }  
334.     /**  
335.      *  
336. <br/>
337.      * 获得一个时间字符串,格式为:yyyy-MM-dd HH:mm:ss  
338.      * day  如果为整数,表示未来时间  
339.      *      如果为负数,表示过去时间  
340.      * @author Tony  
341. <br/>
342.      */  
343.     public static String getFromNow(int day) {  
344. date = new
345. dateTime
346.         date.setTime(dateTime * 1000);  
347.         return formatter2.format(date);  
348.     }  
349.     /**  
350.      * 判断是否润年  
351.      *  
352.      * @param ddate  
353.      * @return  
354.      */  
355.     public static boolean isLeapYear(String ddate) {  
356.   
357.         /**  
358.          * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年  
359.          * 3.能被4整除同时能被100整除则不是闰年  
360.          */  
361. d = strToDate(ddate);  
362. gc
363.         gc.setTime(d);  
364. year = gc.get(Calendar.YEAR);  
365.         if ((year % 400) == 0)  
366.             return true;  
367.         else if ((year % 4) == 0) {  
368.             if ((year % 100) == 0)  
369.                 return false;  
370.             else  
371.                 return true;  
372.         } else  
373.             return false;  
374.     }  
375.   
376.     /**  
377.      * 返回美国时间格式 26 Apr 2006  
378.      *  
379.      * @param str  
380.      * @return  
381.      */  
382.     public static String getEDate(String str) {  
383. pos = new
384. strtodate = formatter.parse(str, pos);  
385. j = strtodate.toString();  
386. k = j.split(" ");  
387.         return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);  
388.     }  
389.   
390.     /**  
391.      * 获取一个月的最后一天  
392.      *  
393.      * @param dat  
394.      * @return  
395.      */  
396.     public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd  
397. str = dat.substring(0, 8);  
398. month = dat.substring(5, 7);  
399. mon = Integer.parseInt(month);  
400. mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon
401.             str += "31";  
402. mon == 4 || mon == 6 || mon == 9 || mon
403.             str += "30";  
404.         } else {  
405.             if (isLeapYear(dat)) {  
406.                 str += "29";  
407.             } else {  
408.                 str += "28";  
409.             }  
410.         }  
411.         return str;  
412.     }  
413.   
414.     /**  
415.      * 判断二个时间是否在同一个周  
416.      *  
417.      * @param date1  
418.      * @param date2  
419.      * @return  
420.      */  
421.     public static boolean isSameWeekDates(Date date1, Date date2) {  
422. cal1 = Calendar.getInstance();  
423. cal2 = Calendar.getInstance();  
424.         cal1.setTime(date1);  
425.         cal2.setTime(date2);  
426. subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);  
427. 0
428.             if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))  
429.                 return true;  
430. 1 == subYear && 11
431.             // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周  
432.             if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))  
433.                 return true;  
434. -1 == subYear && 11
435.             if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))  
436.                 return true;  
437.         }  
438.         return false;  
439.     }  
440.   
441.     /**  
442.      * 产生周序列,即得到当前时间所在的年度是第几周  
443.      *  
444.      * @return  
445.      */  
446.     public static String getSeqWeek() {  
447. c = Calendar.getInstance(Locale.CHINA);  
448. week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));  
449.         if (week.length() == 1)  
450. week = "0"
451. year = Integer.toString(c.get(Calendar.YEAR));  
452.         return year + week;  
453.     }  
454.   
455.     /**  
456.      * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号  
457.      *  
458.      * @param sdate  
459.      * @param num  
460.      * @return  
461.      */  
462.     public static String getWeek(String sdate, String num) {  
463.         // 再转换为时间  
464. dd = DateUtil.strToDate(sdate);  
465. c = Calendar.getInstance();  
466.         c.setTime(dd);  
467.         if (num.equals("1")) // 返回星期一所在的日期  
468.             c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  
469.         else if (num.equals("2")) // 返回星期二所在的日期  
470.             c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);  
471.         else if (num.equals("3")) // 返回星期三所在的日期  
472.             c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);  
473.         else if (num.equals("4")) // 返回星期四所在的日期  
474.             c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);  
475.         else if (num.equals("5")) // 返回星期五所在的日期  
476.             c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);  
477.         else if (num.equals("6")) // 返回星期六所在的日期  
478.             c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);  
479.         else if (num.equals("0")) // 返回星期日所在的日期  
480.             c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);  
481.         return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
482.     }  
483.   
484.     /**  
485.      * 根据一个日期,返回是星期几的字符串  
486.      *  
487.      * @param sdate  
488.      * @return  
489.      */  
490.     public static String getWeek(String sdate) {  
491.         // 再转换为时间  
492. date = DateUtil.strToDate(sdate);  
493. c = Calendar.getInstance();  
494.         c.setTime(date);  
495. hour=c.get(Calendar.DAY_OF_WEEK);  
496.         // hour中存的就是星期几了,其范围 1~7  
497. 1=星期日 7=星期六,其他类推  
498.         return new SimpleDateFormat("EEEE").format(c.getTime());  
499.     }  
500.     public static String getWeekStr(String sdate){  
501. str = "";  
502. str = DateUtil.getWeek(sdate);  
503.         if("1".equals(str)){  
504. str = "星期日";  
505.         }else if("2".equals(str)){  
506. str = "星期一";  
507.         }else if("3".equals(str)){  
508. str = "星期二";  
509.         }else if("4".equals(str)){  
510. str = "星期三";  
511.         }else if("5".equals(str)){  
512. str = "星期四";  
513.         }else if("6".equals(str)){  
514. str = "星期五";  
515.         }else if("7".equals(str)){  
516. str = "星期六";  
517.         }  
518.         return str;  
519.     }  
520.   
521.     /**  
522.      * 两个时间之间的天数  
523.      *  
524.      * @param date1  
525.      * @param date2  
526.      * @return  
527.      */  
528.     public static long getDays(String date1, String date2) {  
529. date1
530.             return 0;  
531. date2
532.             return 0;  
533.         // 转换为标准时间  
534. date = null;  
535. mydate = null;  
536.         try {  
537. date = formatter.parse(date1);  
538. mydate = formatter.parse(date2);  
539.         } catch (Exception e) {  
540.         }  
541. day
542.         return day;  
543.     }  
544.   
545.     /**  
546.      * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间  
547.      * 此函数返回该日历第一行星期日所在的日期  
548.      *  
549.      * @param sdate  
550.      * @return  
551.      */  
552.     public static String getNowMonth(String sdate) {  
553.         // 取该时间所在月的一号  
554. sdate = sdate.substring(0, 8) + "01";  
555.   
556.         // 得到这个月的1号是星期几  
557. date = DateUtil.strToDate(sdate);  
558. c = Calendar.getInstance();  
559.         c.setTime(date);  
560. u = c.get(Calendar.DAY_OF_WEEK);  
561. newday = DateUtil.getNextDay(sdate, (1 - u) + "");  
562.         return newday;  
563.     }  
564.   
565.     /**  
566.      * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数  
567.      *  
568.      * @param k  
569.      *            表示是取几位随机数,可以自己定  
570.      */  
571.   
572.     public static String getNo(int k) {  
573.   
574.         return getUserDate("yyyyMMddhhmmss") + getRandom(k);  
575.     }  
576.   
577.     /**  
578.      * 返回一个随机数  
579.      *  
580.      * @param i  
581.      * @return  
582.      */  
583.     public static String getRandom(int i) {  
584. jjj = new
585. i
586.             return "";  
587. jj = "";  
588. k = 0; k < i; k++) {  
589. jj = jj
590.         }  
591.         return jj;  
592.     }  
593.   
594.     public static boolean RightDate(String date) {  
595. sdf = new
596. date
597.             return false;  
598. >
599. sdf = new
600.         } else {  
601. sdf = new
602.         }  
603.         try {  
604.             sdf.parse(date);  
605.         } catch (ParseException pe) {  
606.             return false;  
607.         }  
608.         return true;  
609.     }  
610.   
611.     /***************************************************************************  
612. nd=1表示返回的值中包含年度 //yf=1表示返回的值中包含月份 //rq=1表示返回的值中包含日期 //format表示返回的格式 1  
613.      * 以年月日中文返回 2 以横线-返回 // 3 以斜线/返回 4 以缩写不带其它符号形式返回 // 5 以点号.返回  
614.      **************************************************************************/  
615.     public static String getStringDateMonth(String sdate, String nd, String yf, String rq, String format) {  
616. currentTime = new
617. dateString = formatter.format(currentTime);  
618. s_nd = dateString.substring(0, 4); // 年份  
619. s_yf = dateString.substring(5, 7); // 月份  
620. s_rq = dateString.substring(8, 10); // 日期  
621. sreturn = "";  
622. mc = new
623. sdate
624. sdate
625.             if (nd.equals("1")) {  
626. sreturn = s_nd;  
627.                 // 处理间隔符  
628.                 if (format.equals("1"))  
629. sreturn = sreturn
630.                 else if (format.equals("2"))  
631. sreturn = sreturn
632.                 else if (format.equals("3"))  
633. sreturn = sreturn
634.                 else if (format.equals("5"))  
635. sreturn = sreturn
636.             }  
637.             // 处理月份  
638.             if (yf.equals("1")) {  
639. sreturn = sreturn
640.                 if (format.equals("1"))  
641. sreturn = sreturn
642.                 else if (format.equals("2"))  
643. sreturn = sreturn
644.                 else if (format.equals("3"))  
645. sreturn = sreturn
646.                 else if (format.equals("5"))  
647. sreturn = sreturn
648.             }  
649.             // 处理日期  
650.             if (rq.equals("1")) {  
651. sreturn = sreturn
652.                 if (format.equals("1"))  
653. sreturn = sreturn
654.             }  
655.         } else {  
656.             // 不是空值,也是一个合法的日期值,则先将其转换为标准的时间格式  
657. sdate = getOKDate(sdate);  
658. s_nd = sdate.substring(0, 4); // 年份  
659. s_yf = sdate.substring(5, 7); // 月份  
660. s_rq = sdate.substring(8, 10); // 日期  
661.             if (nd.equals("1")) {  
662. sreturn = s_nd;  
663.                 // 处理间隔符  
664.                 if (format.equals("1"))  
665. sreturn = sreturn
666.                 else if (format.equals("2"))  
667. sreturn = sreturn
668.                 else if (format.equals("3"))  
669. sreturn = sreturn
670.                 else if (format.equals("5"))  
671. sreturn = sreturn
672.             }  
673.             // 处理月份  
674.             if (yf.equals("1")) {  
675. sreturn = sreturn
676.                 if (format.equals("1"))  
677. sreturn = sreturn
678.                 else if (format.equals("2"))  
679. sreturn = sreturn
680.                 else if (format.equals("3"))  
681. sreturn = sreturn
682.                 else if (format.equals("5"))  
683. sreturn = sreturn
684.             }  
685.             // 处理日期  
686.             if (rq.equals("1")) {  
687. sreturn = sreturn
688.                 if (format.equals("1"))  
689. sreturn = sreturn
690.             }  
691.         }  
692.         return sreturn;  
693.     }  
694.   
695.     public static String getNextMonthDay(String sdate, int m) {  
696. sdate = getOKDate(sdate);  
697. year = Integer.parseInt(sdate.substring(0, 4));  
698. month = Integer.parseInt(sdate.substring(5, 7));  
699. month = month
700. < 0) {  
701. month = month
702. year = year
703. >
704. month = month
705. year = year
706.         }  
707. smonth = "";  
708. < 10)  
709. smonth = "0"
710.         else  
711. smonth = ""
712.         return year + "-" + smonth + "-10";  
713.     }  
714.   
715.     /**  
716.      *  
717. <br/>
718.      *  
719.      * @author Tony  
720. <br/>
721.      */  
722.     public static String getOKDate(String sdate) {  
723. sdate
724.             return getStringDateShort();  
725.   
726. //    if (!VeStr.Isdate(sdate)) {  
727. //     sdate = getStringDateShort();  
728. //    }  
729. //    // 将“/”转换为“-”  
730. //    sdate = VeStr.Replace(sdate, "/", "-");  
731.         // 如果只有8位长度,则要进行转换  
732.         if (sdate.length() == 8)  
733. sdate = sdate.substring(0, 4) + "-" + sdate.substring(4, 6) + "-" + sdate.substring(6, 8);  
734. pos = new
735. strtodate = formatter.parse(sdate, pos);  
736. dateString = formatter.format(strtodate);  
737.         return dateString;  
738.     }  
739.     /**  
740.      * 获取当前时间的前一天时间  
741.      * @param cl  
742.      * @return  
743.      */  
744.     private static String getBeforeDay(Calendar cl){  
745.         //使用roll方法进行向前回滚  
746.         //cl.roll(Calendar.DATE, -1);  
747.         //使用set方法直接进行设置  
748. day = cl.get(Calendar.DATE);  
749.         cl.add(Calendar.DATE, -1);  
750.         return formatter.format(cl.getTime());  
751.     }  
752.   
753.     /**  
754.      * 获取当前时间的后一天时间  
755.      * @param cl  
756.      * @return  
757.      */  
758.     private static String getAfterDay(Calendar cl){  
759.         //使用roll方法进行回滚到后一天的时间  
760.         //cl.roll(Calendar.DATE, 1);  
761.         //使用set方法直接设置时间值  
762. day = cl.get(Calendar.DATE);  
763.         cl.add(Calendar.DATE, 1);  
764.         return formatter.format(cl.getTime());  
765.     }  
766.   
767.     private static String getDateAMPM(){  
768. ca = new
769.         //结果为“0”是上午     结果为“1”是下午  
770. i=ca.get(GregorianCalendar.AM_PM);  
771. i==0?"AM":"PM";  
772.     }  
773.     private static int compareToDate(String date1,String date2){  
774.         return date1.compareTo(date2);  
775.     }  
776.     private static int compareToDateString(String date1,String date2){  
777. formatter = new
778. i=0;  
779.         try {  
780. ldate1=formatter.parse(date1).getTime();  
781. ldate2=formatter.parse(date2).getTime();  
782. >ldate2){  
783. i=1;  
784. ldate1==ldate2){  
785. i=0;  
786.             }else{  
787. i=-1;  
788.             }  
789.   
790.         } catch (ParseException e) {  
791.             e.printStackTrace();  
792.         }  
793.         return i;  
794.     }  
795.   
796.     public static String[] getFiveDate(){  
797. dates=new
798. calendar = Calendar.getInstance();  
799.         calendar.setTime(new Date());  
800. five=" 05:00:00";  
801.   
802.         if(getDateAMPM().equals("AM")&&compareToDateString(getStringDate(),getStringDateShort()+five)==-1){  
803.             dates[0]=getBeforeDay(calendar)+five;  
804.             dates[1]=getStringDateShort()+five;  
805.         }else{  
806.             dates[0]=getStringDateShort()+five;  
807.             dates[1]=getAfterDay(calendar)+five;  
808.         }  
809.   
810.         return dates;  
811.     }  
812.     public static String getFiveDate2(){  
813. calendar = Calendar.getInstance();  
814.         calendar.setTime(new Date());  
815. five=" 05:00:00";  
816. reStr="";  
817.         if(getDateAMPM().equals("AM")&&compareToDateString(getStringDate(),getStringDateShort()+five)==-1){  
818. reStr=getBeforeDay(calendar);  
819.         }else{  
820. reStr=getStringDateShort();  
821.         }  
822.         return reStr;  
823.     }  
824. }