在开发项目的过程中,“客户”提出了根据日期的迟早,加载最新的通知信息的需求。想了好多方法,最终编写了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 }
时间: 2024-11-06 12:40:14