2019年07月17日(星期三)  农历:己亥年六月十五
  • 首页
  • JAVA
  • Java给定某年某月输出该月日历

作者:三年。分类: JAVA

给定两个日子计算相差天数给定某个日子,返回在一周的第几天 ,接下来还有一个给定某年某月,输出该月日历;

其实思想很简单,都是与1900-1-1相减,这样得到每月的第一天星期几,这样便于输出第一行;

如:

日 一 二 三 四 五 六

1 2 3 4

接下来对下面的进行一行一行的输出 就简单了,主要思想呢,就是这样;

printf( 日 一 二 三 四 五 六

);

if(temp < 6) //把该月的第一行输出

{

temp++;

while(temp--)

{

printf( ); //输出前面的空格

}

temp = 7 - days - 1;

i = 1;

while(i <= temp)

{

printf( %d , i++); //输出这月的头temp天

}

printf(

);

}

上述是将第一行输出,当然,如果1号是星期天的话,我们直接把它当做整的输出 了;

如果本月是2月,进行是否是闰年判断:

if(month == 2)

mon[1] += isleapyear(years);

最后将本月后面日期输出即可:

temp = 7 - days;

while(temp <= mon[month - 1])

{

if(temp < 10)

printf( %d , temp);

else

printf( %d , temp);

if((temp + days + 1) % 7 == 0)

printf(

);

temp++;

}


由于5号与10号占据的位置不一样,所以,对于小于10号的与10后及以后的日子输出的格式差一个空格 ;另外,每过七天就输出换行;

如2013年12月:

data-cke-saved-src=http://<a href='http://www.echohoo.com/?sort=16' target='_blank' title=java>java</a>.chinaitlab.com/UploadFiles_8734/201401/20140114212449544.jpg
data-cke-saved-src=http://<a href='http://www.echohoo.com/?sort=16' target='_blank' title=java>java</a>.chinaitlab.com/UploadFiles_8734/201401/20140114212450658.jpg

万年历上的由星期一开始的...不过效果是一样的,大家有兴趣,做一个和万年历一样的也可以...

如2012年2月:

data-cke-saved-src=http://<a href='http://www.echohoo.com/?sort=16' target='_blank' title=java>java</a>.chinaitlab.com/UploadFiles_8734/201401/20140114212450274.jpg
data-cke-saved-src=http://<a href='http://www.echohoo.com/?sort=16' target='_blank' title=java>java</a>.chinaitlab.com/UploadFiles_8734/201401/20140114212450107.jpg

由于时间原因,代码有点乱,欢迎交流:

/**********

* 2013-12-31

* _Luffy

* http://blog.csdn.net/xjm199

***********/

#include

int isleapyear(int year) //是否是闰年

{

int temp = 0;

if((year % 4 == 0 && year % 100 != 0)|| year % 400 == 0)

temp = 1;

return temp;

}

int sum(int year, int month, int day)

{

int mon[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int sum = (year - 1) * 365; //自公元1年来的天数

int i;

sum += (year - 1) / 4 + 1; //能被4整除的都加上

sum -= (year - 1) / 100 + 1; //其中被100整除的不是闰年

sum += (year - 1) / 400 + 1; //实际上能被400整除的即为闰年

for(i = 0; i < month - 1; ++i) //将本年的剩下日期加上

sum += mon[i];

if(isleapyear(year) == 1 && month > 2) //本年是否闰2月

++sum;

sum += day; //本月的日子加上

return sum;

}

void print(int years, int month, int days) //days是减去星期一的取余

{

int mon[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int temp = days;

int i;

if(month == 2)

mon[1] += isleapyear(years);

printf( 日 一 二 三 四 五 六

);

if(temp < 6) //把该月的第一行输出

{

temp++;

while(temp--)

{

printf( );

}

temp = 7 - days - 1;

i = 1;

while(i <= temp)

{

printf( %d , i++);

}

printf(

);

}

temp = 7 - days;

while(temp <= mon[month - 1])

{

if(temp < 10)

printf( %d , temp);

else

printf( %d , temp);

if((temp + days + 1) % 7 == 0)

printf(

);

temp++;

}

}

int main()

{

//一周的第一天是周日,1900年1月1日星期一

int year = 2013;

int month = 12;

int days = sum(year, month, 1) - sum(1900, 1, 1); //自1900年1月1日后的天数

days = days % 7;

print(year, month, days);

return 0;

}

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1391 人参与

发表评论:



手Q扫描加入Java初学者群