import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
public class TestCalendar {
public static void main(String[] args) {
Locale.setDefault(Locale.US);
GregorianCalendar cal = new GregorianCalendar();
int today = cal.get(Calendar.DAY_OF_MONTH); // 获得日期
int month = cal.get(Calendar.MONTH); // 获取月份 0-11
cal.set(Calendar.DAY_OF_MONTH, 1); // 设置成当月的第一天
int weekday = cal.get(Calendar.DAY_OF_WEEK); // 看1号是是当前周的第几天,US星期天是第一天
int firstDayOfWeek = cal.getFirstDayOfWeek(); // 获取1号所在的这一周的第一天,1在US代表星期天
int indent = 0; // counter,看和当前周的第一天相差几天
while (weekday != firstDayOfWeek) { // 说明这一周的第一天是跨月的,属于上个月
indent++;
cal.add(Calendar.DAY_OF_MONTH, -1);
weekday = cal.get(Calendar.DAY_OF_WEEK);
}
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do {
System.out.printf("%4s", weekdayNames[weekday]); //用4个字符的宽度打印后面的字符串,不足4位用空格补齐
cal.add(Calendar.DAY_OF_MONTH, 1);
weekday = cal.get(Calendar.DAY_OF_WEEK);
} while (weekday != firstDayOfWeek); //while do 和 do while 的区别是,当while判断不成立时. do while循环至少执行一次
System.out.println();
for (int i = 1; i <= indent; i++) {
System.out.print(" "); //4个字符宽度.和title宽度保持一致
}
cal.set(Calendar.DAY_OF_MONTH, 1); //重置为需要打印开始的日期,本月的第一天
do {
// print day
int day = cal.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day); //用3个字符的宽度打印后面的十进制整数,不足4位用空格补前面
if (day == today)
System.out.print("*");
else
System.out.print(" ");
cal.add(Calendar.DAY_OF_MONTH, 1);
weekday = cal.get(Calendar.DAY_OF_WEEK);
if (weekday == firstDayOfWeek)
System.out.println();
} while (cal.get(Calendar.MONTH) == month);
if (weekday != firstDayOfWeek)
System.out.println();
}
}
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15* 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30