计算某一月份的最大天数
, r& O6 R- [: ?8 F, R Calendar time=Calendar.getInstance();
: }0 i+ r, a4 F5 Z: U" D0 l3 b- w time.clear();
" ^ t, Q( K; |- E7 \/ ` time.set(Calendar.YEAR,year);
' \5 Y- P8 g4 f- g9 a7 W time.set(Calendar.MONTH,i-1);//注意,Calendar对象默认一月为0
* z2 F1 V- e4 W! M q int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数 $ ^* P8 _3 G8 U7 N
注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间
" \# s- u" [, l, ?' |; A 2.Calendar和Date的转化
; u' Z) |/ y% W/ k2 Z9 Y (1) Calendar转化为Date ! c; b1 Y2 U& i5 d+ a
Calendar cal=Calendar.getInstance();
4 _2 Y) N B9 N5 y Date date=cal.getTime();
; A' z( z: S& T) o (2) Date转化为Calendar
3 m6 E: [( W' Z! T1 s# ] Date date=new Date(); 4 r0 o0 ]+ ]' h' t2 B$ C5 f
Calendar cal=Calendar.getInstance(); + i/ O9 h: {6 y
cal.setTime(date);
8 _- c: K5 N& a 3.格式化输出日期时间 : k, |( N/ ]$ j0 M8 L8 p8 Q( u
Date date=new Date();
+ [1 q; Y) H. M1 U7 Z SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 3 }3 R- {- d) W
System.out.println(df.format(date));
& Y0 Q9 h$ ^6 t# Z, `3 U 4.计算一年中的第几星期 + w8 O$ H2 J& y
(1)计算某一天是一年中的第几星期 & P# H1 k' F0 Y7 {6 U/ @+ M7 u4 b
Calendar cal=Calendar.getInstance();
B: {2 O R) _ f( n cal.set(Calendar.YEAR, 2006);
9 ~0 q+ _# d7 \" y0 ? cal.set(Calendar.MONTH,; % N( ~+ t( G; H" I8 R
cal.set(Calendar.DAY_OF_MONTH, 3);
) |+ ^/ ~: g8 X: x6 h int weekno=cal.get(Calendar.WEEK_OF_YEAR); 1 ^$ S7 R5 ^# z) o* G% X7 [
(2)计算一年中的第几星期是几号 ' [& a8 l) b! N
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
- c4 ^( C; n/ h- f Calendar cal=Calendar.getInstance();
& U* ?# X- [) Z& }! ` cal.set(Calendar.YEAR, 2006); : z% a5 ~: i6 F) }6 `) P+ c0 g8 ]
cal.set(Calendar.WEEK_OF_YEAR, 1);
1 |& C: c1 d; u8 i/ P cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
7 d0 [" X. }& b$ A; h5 @2 L7 W, i System.out.println(df.format(cal.getTime())); ' t, d/ j3 [/ P, O& b8 v0 A$ A
输出:
! `; r4 N/ ^5 J/ L0 @ 2006-01-02 3 ?3 m- l0 K3 T5 H* M% ^
5.add()和roll()的用法 ( U, k$ T4 B X5 [9 @
(1)add()方法
: g0 x. L2 a8 o3 Y) u G SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
' M. n2 F/ a- p2 A/ h' _* [ Calendar cal=Calendar.getInstance(); + ?9 A9 U( [9 Y5 `: A* u' G
cal.set(Calendar.YEAR, 2006); % B: }9 A |! z8 C3 a5 ?6 u' U0 ]
cal.set(Calendar.MONTH,;
' e: {3 G: r( y cal.set(Calendar.DAY_OF_MONTH, 3);
: D1 V* H/ S: D5 R+ v! e! m cal.add(Calendar.DATE, -4); 3 V6 k. Y! H( _* i, E! V A
Date date=cal.getTime(); ; u9 S0 D" U g' q
System.out.println(df.format(date)); ; W+ g1 M; [" O& R# ]
cal.add(Calendar.DATE, 4); - R& }1 ?2 ~. f$ z* w8 `" T
date=cal.getTime();
) H3 w2 R" Y9 w8 w6 g' b+ H& G System.out.println(df.format(date));
0 x, M+ e) {) x' z0 g 输出 & g0 H- I' y9 o" f
2006-08-30 C; d+ Y* M( j
2006-09-03 ; ?8 m! }! M; r7 p
(2)roll方法 : N3 A! A- M3 B$ g0 a( ]5 j
cal.set(Calendar.YEAR, 2006);
! ^+ A1 L+ @6 T- ^( [% ^ cal.set(Calendar.MONTH,; ; K7 D/ S9 F- e
cal.set(Calendar.DAY_OF_MONTH, 3);
, x0 d& E5 I5 K1 |# E cal.roll(Calendar.DATE, -4); $ c# R3 Z0 \, C% ~* [2 F
date=cal.getTime(); 2 S H' x+ ]2 @" U- r
System.out.println(df.format(date)); : d4 J4 U- I* Q. V# g& m
cal.roll(Calendar.DATE, 4);
+ i+ j; r2 a% n' N# X date=cal.getTime();
* l1 d! N0 ~$ @/ n8 r) Q1 E System.out.println(df.format(date));
0 b; }* G0 u; w 输出 ( K `0 G$ c/ I' t: V
2006-09-29
5 o2 h3 l; f! j( h1 d 2006-09-03
+ ~% p! v4 `/ f3 y3 G6 R6 k0 B- X5 N 可见,roll()方法在本月内循环,一般使用add()方法; , ~8 R( c# @: Q3 V
6.计算两个任意时间中间的间隔天数
; V$ i! V" a& l# A) k2 Y& L (1)传进Calendar对象
, K1 I" U9 o! R; f r" k' a& k p- a /**计算两个时间之间相隔天数
$ Z. y9 ]" u3 B+ K0 ~, V$ x9 x * @param startday 开始时间
, a9 C$ z# j P+ N5 N * @param endday 结束时间
6 r. M/ }5 B' I. C3 V * @return 8 F4 Z& {. e2 N& f6 B; L3 W9 t6 L3 h
*/
& R0 x: }2 J% u5 `5 ~ public int getIntervalDays(Calendar startday,Calendar endday){
+ B" J" ^+ P2 b# O2 @ //确保startday在endday之前 T$ `1 h2 l$ v3 ]" ]
if(startday.after(endday)){ ( P! {1 M/ O! k# U- D1 U* T' q
Calendar cal=startday;
7 X; a' Z* s6 `0 ~) B! S) K startday=endday; % E: h$ b/ e( R" g: |; x3 f
endday=cal;
- z, E# a9 U7 [; g }
& E5 E8 Z# x- ~ //分别得到两个时间的毫秒数 8 g% N) E& g4 O/ w! a7 K
long sl=startday.getTimeInMillis(); s2 v2 m$ k2 e( k' `
long el=endday.getTimeInMillis(); - j; y; ~! s# y8 d/ p X
long ei=el-sl;
+ U6 V2 d9 S1 v: B v& p g0 T; E6 Y //根据毫秒数计算间隔天数 # _5 y$ F1 M/ j ^. ~( Z! V$ h
return (int)(ei/(1000*60*60*24)); , S# b# C# c$ V) B8 C
}
& }# ~+ R& _+ g/ L% { (2)传进Date对象
0 ~* x; x" D" t& I' W( u! X# X /**计算两个时间之间相隔天数
3 S& @4 b, a9 e2 ~ * @param startday 开始时间
/ x7 o/ j& W& C5 a. D9 J% p * @param endday 结束时间
j- d5 k1 O& `* m * @return / ^5 k: W3 N* N0 w* V4 ]
*/
+ Y J/ Y/ V2 \ ^) a4 y public int getIntervalDays(Date startday,Date endday){
& _+ y- p5 D1 k$ q9 h" Z //确保startday在endday之前
: g# M$ L& G6 C8 @: I: ` if(startday.after(endday)){
+ w9 |% d" Z7 M- c4 M; X0 k Date cal=startday; $ U9 W; h3 ?. T; T9 A t! r
startday=endday; 6 [' L5 t( _$ W+ j* v9 o& S
endday=cal; 2 [, E+ }# K& J6 v4 J
} 1 m6 y8 k0 }+ M
//分别得到两个时间的毫秒数 $ P- n; Z E7 S; H _, [
long sl=startday.getTime(); , Z; c$ N) R, n% R2 W0 _2 {
long el=endday.getTime();
, k# n8 n# Y4 K& w7 N1 n. T, \ long ei=el-sl;
! s1 A$ S5 l9 E4 c0 x3 R4 }- `& Z" o$ B //根据毫秒数计算间隔天数 + q5 Z; M4 _, L W: ]1 O0 T/ ~
return (int)(ei/(1000*60*60*24)); " M9 {- d: A' [, c) D' c" q6 u
} & Y; m! C/ Z; g" s9 t, p9 H1 l c
同理,可以用相同的方法计算出任意两个时间相隔的小时数,分钟数,秒钟数等
+ M- o& A$ ]8 N. |9 [ 注:以上方法是完全按时间计算,有时并不能令人满意,如 c( c& \8 `0 P/ Y4 |+ G3 Y
startday="2006-10-11 20:00:00"
7 ` K( O; q q! m endday="2006-10-12 8:00:00" 6 M* M$ Y1 q0 b/ \) u) }1 ^
计算结果为0,但是我们也许相让计算结果变为1,此时可以用如下方法实现 . G; s5 A- [4 X
在传参之前,先设定endday的时间,如
0 K( u# h+ H+ M# @7 `' W endday.set(Calendar.HOUR_OF_DAY, 23);
+ Y* C9 P; c: c) r& O endday.set(Calendar.MINUTE, 59);
- l: t5 }) R Z endday.set(Calendar.SECOND, 59); 2 H8 m W4 K6 m3 x/ y
endday.set(Calendar.MILLISECOND, 59); 9 L( r6 f5 D7 j
这样再传进去startday,endday,则结果就如我们所愿了。不过,如果嫌以上方法麻烦,可以参考以下方法 |