版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011172283/article/details/50704661
我们平时常用的java时间工具类应该有Date和GregorianCalendar,其中Date类的实例状态表示的是一个时间点,而GregorianCalendar则是以日历的方式管理时间,非常方便的就可以实现时间的定位和时间的偏移(从现在这一刻往前或后延时几天,几小时等),相对于Date类,GregorianCalendar则灵活了很多。
使用GregorianCalendar需要注意的是月份从0开始计数,因此11表示十二月。为了清晰起见,也可以使用常量。如Calendar.DECEMBER。今天以例子+注释的方式记录GregorianCalendar的常见用法。
这个实例是按常见的日历格式,打印了本月的日历,运行结果如下:
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
public class CalendarTest {
public static void main(String[] args) {
Calendar.DECEMBER
// 设置默认位置
Locale.setDefault(Locale.CHINESE);
// 获取当前日期
GregorianCalendar calendar = new GregorianCalendar();
// 获取今天是当前月的第几天
int today = calendar.get(Calendar.DAY_OF_MONTH);
// 获取当前是今年第几个月;一月是0
int month = calendar.get(Calendar.MONTH);
// 将时间设为当前月第一天
calendar.set(Calendar.DAY_OF_MONTH, 1);
// 获取本月第一天是一周的第几天
int weekday = calendar.get(Calendar.DAY_OF_WEEK);
// 获取星期是从那天开始,美国周日是星期的第一天
int firstDayOfWeek = calendar.getFirstDayOfWeek();
// 确定本月第一天是星期几,前面应该输出多少空位
int indent = 0;
// 循环计算本月的第一天是一个星期的第几天,以确定第一行输出多少空格
while (weekday != firstDayOfWeek) {
indent++; // 输出空格计数+1
// 把日期往前减一天,非常方便的调整时间,
// add负数,时间往前推,反之后推
calendar.add(Calendar.DAY_OF_MONTH, -1);
// 前一天是一星期的第几天
weekday = calendar.get(Calendar.DAY_OF_WEEK);
}
// 获取星期简写(Sun Mon Tue...)
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do {
// 经过上面的循环,这里weekday已经是一个星期的第一天了
// 这里输出星期标题
System.out.printf("%8s",weekdayNames[weekday]);
calendar.add(Calendar.DAY_OF_MONTH, 1);
weekday = calendar.get(Calendar.DAY_OF_WEEK);
} while (weekday != firstDayOfWeek);
System.out.println();
// 打印本月第一天距星期第一天之间的空格
for (int i = 0; i < indent; i++) {
System.out.print(" ");
}
// 重置日期为本月第一天
calendar.set(Calendar.DAY_OF_MONTH, 1);
// 打印日期
do {
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.printf("%6d",day);
// 用*标记当前天
if (day == today) {
System.out.print("*");
}else {
System.out.print(" ");
}
// 打印完后,日期后推一天
calendar.add(Calendar.DAY_OF_MONTH, 1);
weekday = calendar.get(Calendar.DAY_OF_WEEK);
// 打印到下一周换行
if (weekday == firstDayOfWeek) {
System.out.println();
}
}
// 如果还在本月,就一直打印直到下个月
while (calendar.get(Calendar.MONTH) == month);
}
}
GregorianCalendar相对于Date类还是有不少优越性的,如果只是获取一下当前时间点,当然一个Date类就够了,但是如果需要管理时间,计算时间段,时间往前或者往后延伸,那么GregorianCalendar的优越性还是很明显的