a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 131|回复: 1

[JAVA] Java时间类以及函数

[复制链接]
发表于 2012-7-31 22:04:26 | 显示全部楼层 |阅读模式
计算某一月份的最大天数
, 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,则结果就如我们所愿了。不过,如果嫌以上方法麻烦,可以参考以下方法
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:27 | 显示全部楼层

Java时间类以及函数

  (3)改进精确计算相隔天数的方法
+ d1 v, a* B1 n0 y/ u  public int getDaysBetween (Calendar d1, Calendar d2) {
( Q: a& H5 P: n& S5 [8 r6 g  if (d1.after(d2)) {  // swap dates so that d1 is start and d2 is end 1 r( i% j) J) N+ g  r, |
  java.util.Calendar swap = d1;
2 N* N/ H7 H2 m1 E6 e" K0 e+ t2 R  d1 = d2; 6 y- _7 n1 Q, x5 l  J  t
  d2 = swap; 8 E' d- j( g, n. Z
  } 1 L3 M3 x- ~; ]5 G: [5 c! v
  int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
, F  i3 X0 h! ]7 {  int y2 = d2.get(Calendar.YEAR); 7 O7 |0 ]! o8 Z) W. o; R6 z
  if (d1.get(Calendar.YEAR) != y2) { & M4 [' X1 n0 g3 k1 w! M# }
  d1 = (Calendar) d1.clone(); 3 H- ~4 m7 M2 j, m6 U
  do {
" |2 w+ _  G/ Y/ S0 R1 c  days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数 5 o/ ?) L2 ?2 A" I* P7 K+ B$ Q
  d1.add(Calendar.YEAR, 1);
- J/ z# i: s( X, W  ]% r  } while (d1.get(Calendar.YEAR) != y2);
" l9 g& f( _1 G4 i' U4 \0 x+ Y3 q  } ) Q) U4 Q' l" }
  return days;   }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-3 08:32 , Processed in 0.196568 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表