码迷,mamicode.com
首页 > 其他好文 > 详细

分享:GenericCalendar工具类

时间:2015-04-29 18:53:47      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:

  在开发项目的过程中,“客户”提出了根据日期的迟早,加载最新的通知信息的需求。想了好多方法,最终编写了org.warnier.zhang.utils.GenericCalendar类满足客户需求,实现过程中参考了java.util.Calendar类的compareTo()方法;

  GenericCalendar类中最出彩之处在于计算距公元1年1月1日天数的方法getDaysOf(),代码如下:

 1     /**
 2      * 计算当前日期距公元1年1月1日的天数;
 3      * @param calendar
 4      * @return 当前日期距公元1年1月1日的天数;
 5      */
 6     private int getDaysOf(GenericCalendar calendar){
 7         int[][] days = {
 8                 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
 9                 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
10         };
11         
12         int result = calendar.currentDay;
13         for(int i = 1; i < calendar.currentYear; i ++){
14             result  = result + 365 + (((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) ? 1 : 0);
15         }
16         int leap = ((calendar.currentYear % 4 == 0 && calendar.currentYear % 100 != 0) || calendar.currentYear % 400 == 0) ? 1 : 0;
17         for(int j = 1; j < calendar.currentMonth; j ++){
18             result += days[leap][j];
19         }
20         return result;
21     }

  通过一个二维数组和闰年的判断标志leap来确定二月具体是28天还是29天。

  完整的代码如下:

 1 package org.warnier.zhang.utils;
 2 
 3 import java.util.Calendar;
 4 import java.util.GregorianCalendar;
 5 
 6 /**
 7  * 日历的工具类,主要实现两个日期比较的功能;
 8  * @author Warnier-zhang
 9  *
10  */
11 public class GenericCalendar{
12     public int currentYear;
13     public int currentMonth;
14     public int currentDay;
15     
16     /**
17      * 根据当前日期的年,月,日初始化日历;
18      */
19     public GenericCalendar(){
20         Calendar calendar = new GregorianCalendar();
21         currentYear = calendar.YEAR;
22         currentMonth = calendar.MONTH;
23         currentDay = calendar.DAY_OF_MONTH;
24     }
25     
26     /**
27      * 根据指定日期的年,月,日初始化日历;
28      * @param currentYear
29      * @param currentMonth
30      * @param currentDay
31      */
32     public GenericCalendar(int currentYear, int currentMonth, int currentDay){
33         this.currentYear = currentYear;
34         this.currentMonth = currentMonth;
35         this.currentDay = currentDay;
36     }
37     
38     /**
39      * 根据日期的年,月,日,比较两个日期;
40      * @param anotherCalendar
41      * @return 比较当前日期是否比参照日期迟;返回 1,表示迟;返回 0,表示相同;返回 -1,表示早;
42      */
43     public int compareTo(GenericCalendar anotherCalendar){
44         return compareTo(getDaysOf(anotherCalendar));
45     }
46     
47     /**
48      * 计算当前日期距公元1年1月1日的天数;
49      * @param calendar
50      * @return 当前日期距公元1年1月1日的天数;
51      */
52     private int getDaysOf(GenericCalendar calendar){
53         int[][] days = {
54                 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
55                 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
56         };
57         
58         int result = calendar.currentDay;
59         for(int i = 1; i < calendar.currentYear; i ++){
60             result  = result + 365 + (((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) ? 1 : 0);
61         }
62         int leap = ((calendar.currentYear % 4 == 0 && calendar.currentYear % 100 != 0) || calendar.currentYear % 400 == 0) ? 1 : 0;
63         for(int j = 1; j < calendar.currentMonth; j ++){
64             result += days[leap][j];
65         }
66         return result;
67     }
68     
69     /**
70      * 根据距公元1年1月1日的天数来比较两个日期;
71      */
72     private int compareTo(int days){
73         int thisDays = getDaysOf(this);
74         return (thisDays > days) ? 1 : (thisDays == days) ? 0 : -1; 
75     }
76     
77 }

 

分享:GenericCalendar工具类

标签:

原文地址:http://www.cnblogs.com/warnier-zhang/p/4466373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!