副标题#e#
本章主要是保藏一些常用的类和接口,包罗:万年历(夏历、阳历节日、阴历节日)、自界说的Calendar接口。
万年历
源码如下(ChineseCalendar.java):
package com.via.mce.monthcalendar.utils;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
/**
* 夏历日历。<br>
* 将夏历从1901年到2100年之间各年、月的巨细以及积年骨气生存,然后基于这些数据举办计较。<br>
* <br>
* 新增了几个用于夏历的常量属性字段,可以利用get()要领获取日历对应的值;<br>
* 农积年、月、日还可以利用set()/add()/roll()要领配置,其他夏历属性自动计较;<br>
* 别的,还提供了getChinese(int field)要领用于得到夏历的中文文字(仅合用于夏历属性和礼拜)。<br>
* <ul>
* <li>CHINESE_YEAR - 农积年</li>
* <li>CHINESE_MONTH - 夏历月</li>
* <li>CHINESE_DATE - 夏历日</li>
* <li>CHINESE_SECTIONAL_TERM - 当月的骨气</li>
* <li>CHINESE_PRINCIPLE_TERM - 当月的中气</li>
* <li>CHINESE_HEAVENLY_STEM - 农积年的天干</li>
* <li>CHINESE_EARTHLY_BRANCH - 农积年的地支</li>
* <li>CHINESE_ZODIAC - 农积年的属相</li>
* <li>CHINESE_TERM_OR_DATE - 假如当天存在一个骨气则指示骨气,不然假如当天是月朔则指示夏历月,不然指示夏历日</li>
* </ul>
* 留意:<br>
* 由于Calendar类的设定,公历月份从0起始。所有要领都遵循了这一约定。<br>
* 但所有的夏历属性从1起始。纵然是在Calendar提供的要领中,夏历月也是从1起始的,并以负数暗示闰月。<br>
* clear()要领在某些环境下会导致夏历和公历日期差池应或是不能到达预期的重置结果,应只管制止利用。<br>
* 利用getSimpleDateString()得到公历日期字符串时,公历月已经批改;<br>
* 利用getSimpleChineseDateString()得到夏历日期字符串时,夏历闰月以*暗示。<br>
*
* @version 0.12 2011-9-5 <br>
* <blockquote>修复一个当利用夏历正月日期初始化日历时陷入死轮回的问题。</blockquote>
* @version 0.11 2009-12-27 <br>
* <blockquote>修复了获取中文夏历时未计较夏历日期的问题;<br>
* 插手一个字段CHINESE_TERM_OR_DATE用于仿照台历的显示方法:假如当天有骨气则指示骨气,假如是月朔指示夏历月,
* 不然指示夏历日。</blockquote>
* @version 0.10 2009-12-22
*/
public final class ChineseCalendar extends GregorianCalendar {
private static final long serialVersionUID = 8L;
/** 农积年 */
public static final int CHINESE_YEAR = 801;
/** 夏历月 */
public static final int CHINESE_MONTH = 802;
/** 夏历日 */
public static final int CHINESE_DATE = 803;
/** 当月的骨气对应的公历日(前一个骨气) */
public static final int CHINESE_SECTIONAL_TERM = 804;
/** 当月的中气对应的公历日(后一个骨气) */
public static final int CHINESE_PRINCIPLE_TERM = 805;
/** 天干 */
public static final int CHINESE_HEAVENLY_STEM = 806;
/** 地支 */
public static final int CHINESE_EARTHLY_BRANCH = 807;
/** 农积年的属相(生肖) */
public static final int CHINESE_ZODIAC = 808;
/** 骨气可能夏历日 */
public static final int CHINESE_TERM_OR_DATE = 888;
// add by skywang
/** 夏历节日 */
public static final int LUNAR_FESTIVAL = 809;
/** 阳历节日 */
public static final int SOLAR_FESTIVAL = 810;
/** 骨气 */
public static final int CHINESE_TERM = 811;
/** 月可能夏历日 */
public static final int CHINESE_MONTH_OR_DATE = 812;
/** 节日 或 骨气 或 夏历日 */
public static final int FESTIVAL_OR_TERM_OR_DATE = 813;
private int chineseYear;
private int chineseMonth; // 1起始,负数暗示闰月
private int chineseDate;
private int sectionalTerm; // 当月骨气的公历日
private int principleTerm; // 当月中气的公历日
private boolean areChineseFieldsComputed; // 夏历日期是否已经颠末计较确认
private boolean areSolarTermsComputed; // 骨气是否已经颠末计较确认
private boolean lastSetChinese; // 最后配置的是不是夏历属性
// 查察本栏目
自界说的Calendar接口
这些接口在写日历措施时大概会用到。
源代码如下(CalendarSelfDefineTest.java):
import java.util.Calendar;
/**
* 按照Calendar的API封装的一些常用函数
*
* @author skywang
* @email [email protected]
*/
public class CalendarSelfDefineTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// 配置日期为“2013-09-18”
cal.set(2013, Calendar.SEPTEMBER, 18);
// 获取“年”
System.out.printf("year: %s\n", getYear(cal) );
// 获取“月”
System.out.printf("month: %s\n", getMonth(cal) );
// 获取“上月”
System.out.printf("previcou month: %s\n", getLastMonth(cal) );
// 获取“下月”
System.out.printf("next month: %s\n", getNextMonth(cal) );
// 获取“日”
System.out.printf("day: %s\n", getDay(cal) );
// 获取Cal对应礼拜几
System.out.printf("weekday: %s\n", getWeekDay(cal) );
// 本月天数
System.out.printf("Current Month days: %s\n", getMonthDays(cal) );
// 上月天数
System.out.printf("Previcous Month days: %s\n", getPrevMonthDays(cal) );
// 下月天数
System.out.printf("Next Month days: %s\n", getNextMonthDays(cal) );
// 获取当月第一天的礼拜几
System.out.printf("First day' weekday : %s\n", getFirstDayWeekday(cal) );
// 获取当前月最后一天的礼拜几
System.out.printf("Last day' weekday : %s\n", getLastDayWeekday(cal) );
// 获取上月最后一天的礼拜几
System.out.printf("PrevMonth Last day' weekday: %s\n", getLastDayWeekdayOfPrevMonth(cal) );
// 获取下月第一天的礼拜几
System.out.printf("NextMonth First day' weekday: %s\n", getFirstDayWeekdayOfNextMonth(cal) );
}
/**
* 获取“年”
*
* @return 譬喻,2013-09-18,则返回2013
*/
public static int getYear(Calendar cal) {
return cal.get(Calendar.YEAR);
}
/**
* 获取“月”
*
* @return 返回值可觉得以下值:
* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。
* 个中第一个月是 JANUARY,它为 0。
*
* 譬喻,2013-09-18,则返回8
*/
public static int getMonth(Calendar cal) {
return cal.get(Calendar.MONTH);
}
/**
* 获取“上一个月”
*
* @return 返回值可觉得以下值:
* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。
* 个中第一个月是 JANUARY,它为 0。
*
* 譬喻,2012-01-12的上一个月是“11”(即DECEMBER)。
*/
public static int getLastMonth(Calendar cal) {
return (cal.get(Calendar.MONTH) + 11) % 12;
}
/**
* 获取“下一个月”
*
* @return 返回值可觉得以下值:
* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。
* 个中第一个月是 JANUARY,它为 0。
*
* 譬喻,2013-12-12的下一个月是“1”(即DECEMBER)。
*/
public static int getNextMonth(Calendar cal) {
return (cal.get(Calendar.MONTH) + 13) % 12;
}
/**
* 获取“日”
*
* @return 譬喻,2013-09-18,则返回18
*
*/
public static int getDay(Calendar cal) {
return cal.get(Calendar.DATE);
}
/**
* 获取“本月的天数”
*
* @return 譬喻,2013-09-18,则返回30
*
*/
public static int getMonthDays(Calendar cal) {
return cal.getActualMaximum(Calendar.DATE);
}
/**
* 获取“上一个月的天数”
*
* @return 譬喻,2013-01-18,则返回31 (因为2012-12有31天)
*
*/
public static int getPrevMonthDays(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.add(Calendar.MONTH, -1); // 设为“上一个月”
return tmpCal.getActualMaximum(Calendar.DATE);
}
/**
* 获取“下一个月的天数”
*
* @return 譬喻,2013-12-18,则返回31 (因为2014-01有31天)
*
*/
public static int getNextMonthDays(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.add(Calendar.MONTH, 1); // 设为“下一个月”
return tmpCal.getActualMaximum(Calendar.DATE);
}
/**
* 获取Cal对应礼拜几
*
* @return 返回“礼拜几”,可觉得以下值:
* SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和 SATURDAY。
* SUNDAY为1,MONDAY为2,依次类推。
* 譬喻,2013-09-18(礼拜三),则返回4
*/
public static int getWeekDay(Calendar cal) {
return cal.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取当月第一天对应礼拜几
*
* @return SUNDAY为1,MONDAY为2,依次类推。
*/
public static int getFirstDayWeekday(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.set(Calendar.DATE, 1); // 把日期配置为当月第一天
return tmpCal.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取当前月最后一天对应礼拜几
*
* @return SUNDAY为1,MONDAY为2,依次类推。
*/
public static int getLastDayWeekday(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.set(Calendar.DATE, 1); // 把日期配置为当月第一天
tmpCal.roll(Calendar.DATE, -1); // 把日期配置为当月最后一天
return tmpCal.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取上月最后一天的礼拜几
*
* @return SUNDAY为1,MONDAY为2,依次类推。
*/
public static int getLastDayWeekdayOfPrevMonth(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.set(Calendar.DATE, 1); // 把日期配置为当月第一天
tmpCal.add(Calendar.DATE, -1); // 把日期配置为上一个月最后一天
return tmpCal.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取下月第一天的礼拜偏移
*
* @return SUNDAY为1,MONDAY为2,依次类推。
*/
public static int getFirstDayWeekdayOfNextMonth(Calendar cal) {
Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后头对tmpCal操纵,就不会改变cal
tmpCal.add(Calendar.MONTH, 1); // 设为“下一个月”
tmpCal.set(Calendar.DATE, 1); // 设为“第一天”
return tmpCal.get(Calendar.DAY_OF_WEEK);
}
}
