黑马程序员技术交流社区
标题:
关于输入现在的年份月份----得出日历问题
[打印本页]
作者:
恨天~无过…
时间:
2014-5-4 16:06
标题:
关于输入现在的年份月份----得出日历问题
本帖最后由 恨天~无过… 于 2014-5-5 00:02 编辑
package Date.com.test;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Scanner;
public class Kalendar_day_Test {
/**
* @param args
* @throws ParseException
* 创建一个现在输入的年份及月份得出此年此月日历
*/
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("请输入现在的年份");
int year = in.nextInt();
System.out.println("请输入现在的月份");
int month = in.nextInt();
String str = year + "-" + month + "-1";
print(str, year, month);
}
public static void print(String str, int year, int month)
throws ParseException {
String str2 = "1900-1-1"; // 设置参照的时间,因为此时间为星期一
int day = toTimeDay(str, str2);
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
int x = day % 7; // 为了保证前面的空格,模7的余数就是空格数;
for (int i = 0; i <= x; i++) {
System.out.print("\t");
}
int mon_day = 0;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
|| month == 10 || month == 12) { // 根据月份来判断这个月有多少天
mon_day = 31;
} else if (month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 判断year此年是平年还是瑞年
mon_day = 29;
} else {
mon_day = 28;
}
} else {
mon_day = 30;
}
int t = 1;
for (int i = 1; i <= mon_day; i++) {
int sum = (day + t) % 7;
if (sum == 6) {
System.out.println(i);
} else {
System.out.print(i + "\t");
}
t++;
}
}
private static int toTimeDay(String str1_date, String str2_date)
throws ParseException {
DateFormat dateFormat = DateFormat.getDateInstance(); // 创建DateFormat对象;
Date date_1 = dateFormat.parse(str1_date); // 根据DateFormat对象的parse方法获取Date对象
Date date_2 = dateFormat.parse(str2_date);
long time_1 = date_1.getTime(); // 根据Date对象的方法获取其对象的毫秒值
long time_2 = date_2.getTime();
long time = Math.abs(time_1 - time_2); // 用相减的方法获取两时间的时间差,为了随机的时间问题,用Math类的abs绝对值方法
int day = toDay(time);
return day;
}
private static int toDay(long time) { // 用于把毫秒值转成天数的方法
// TODO Auto-generated method stub
int day = (int) (time / 1000 / 60 / 60 / 24);
return day;
}
}
复制代码
001.jpg
(33.34 KB, 下载次数: 7)
下载附件
2014-5-4 16:04 上传
002.jpg
(39.32 KB, 下载次数: 20)
下载附件
2014-5-4 16:04 上传
但发现当输入6月份时不行,其它的月份都是可行的,这是哪里分析错误,求赐教!!
作者:
二小傻
时间:
2014-5-4 17:32
int x = day % 7; // 为了保证前面的空格,模7的余数就是空格数;
for (int i = 0; i <= x; i++) {
System.out.print("\t");
}
if (x == 6){
System.out.println();
}
打印制表符的时候判断一下,超出就换行
作者:
NNERO
时间:
2014-5-4 19:47
这个问题其实不是2014年的6月不行,而是只要这个月的1号是星期天就不行。
比如2010年的8月,也会出现这个问题。
原因是: int x = day % 7 这句来判断打印制表符时,如果这个月的1号恰好是周日,那么x=6
这样以来:打印的制表符就是7个。自然就会超出格式范围了。
那么可以加上一个判断来消除这个问题:
if(x==6){//如果x为6,则不打印制表符,这里不打印就是什么也不做就好了
}else{
for (int i = 0; i <= x; i++) {
System.out.print("\t");
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2