世纪末的星期(Java-蓝桥杯-省赛-T1)初学者详解
T1 世纪末的星期
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会....有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日......
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)
【思路】
方法一:运用API文档中Calendar类[1]
public class 世纪末的星期 {public static void main(String[] args) throws ParseException {Calendar calendar = Calendar.getInstance(); //获取子类对象for(int i=1999;i<10000;i+=100) {calendar.set(i, 11, 31); //该处写的一定是11,因为(0~11)对应(1月~12月)if((calendar.get(calendar.DAY_OF_WEEK)==1)) { //(0,1,2,3,4,5,6)对应(星期六,日,一,二,三,四,五)System.out.println(i);break;}} } }
方法二:基姆拉尔森计算公式
y:年 m:月 d:日 w:星期几 w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 注意: 1.w的取值范围是0,1,2,3,4,5,6,分别代表星期日,星期一,星期二,星期三,星期四,星期五,星期六。 2.今年的1、2月要换成去年的13、14月 eg:2020-1-1则换算成2019-13-1来代入公式计算。 3.这个公式可以直接计算出那个日期是星期几,但请注意!这类问题如果假设和真实情况不符的时候要记得换上偏移量,比
public class Main {public static void main(String[] args) {int y = 1999;int m = 12;int d = 31;int w;for(;y<10000;y+=100) {w = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;if(w==0) {System.out.println(y);break;}}} }
【扩展】
java.util.Calendar 是日历类。
在Date后出现,替换掉了许多Date的方法。该类将所有可能 用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。 Calendar类无法直接创建对象使用,里边有一个静态方法getInstance(),该方法返回了 Calendar类的子类对象
1 获取方式
Calendar为抽象类,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:
Calendar cal = Calendar.getInstance();/*Calendar静态方法 public static Calendar getInstance() :使用默认时区和语言环境获得一个日历 */
2 常用方法
public class 世纪末的星期 {public static void main(String[] args) throws ParseException {Calendar calendar = Calendar.getInstance(); //获取子类对象System.out.println("今天时间是:"+calendar.getTime());System.out.println("今天时间是:"+new Date());System.out.println("今年年份是:"+calendar.get(calendar.YEAR)+"年");System.out.println("今天月份是:"+(calendar.get(calendar.MARCH)+1)+"月");System.out.println("今天是几号:"+calendar.get(calendar.DAY_OF_MONTH));System.out.println("今天是几号:"+calendar.get(calendar.DATE)+"日");System.out.println("今天是星期:"+(calendar.get(calendar.DAY_OF_WEEK)-1));//注意:获取星期几(六-五)-(0-6)System.out.println("今天是本月的第几周::"+calendar.get( calendar.DAY_OF_WEEK_IN_MONTH));System.out.println("今天是这一年中的第几天:"+calendar.get(calendar.DAY_OF_YEAR));System.out.println("现在几点:"+calendar.get(calendar.HOUR)); //12小时值System.out.println("现在几点:"+calendar.get(calendar.HOUR_OF_DAY)); //24小时System.out.println("现在几分:"+calendar.get(calendar.MINUTE));System.out.println("现在几秒:"+calendar.get(calendar.SECOND));System.out.println("现在几毫秒:"+calendar.get(calendar.MILLISECOND));calendar.set(1999, 11, 31);System.out.println("指定的时间是:"+calendar.getTime());System.out.println("指定的时间是星期几:"+(calendar.get(calendar.DAY_OF_WEEK)-1));System.out.println("今天时间是:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date()));System.out.println("今天时间是:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(calendar.getTime()));//String 转 DateSimpleDateFormat sdf = new SimpleDateFormat();sdf.applyPattern("yyyy-MM-dd HH:mm:ss SSS");Date d = sdf.parse("2018-08-08 08:08:08 888");System.out.println("今天时间是:"+d);calendar.setTime(d);System.out.println("指定的时间是:"+calendar.getTime());} }
3 注意事项
西方星期的开始为周日,中国为周一。在Calendar类中,月份的表示是以0-11代表1-2月。日期是有大小关系的,时间靠后,时间越大。
算法 基姆拉尔森计算公式外文名是Kim larsen calculation formula。
本公式用来计算指定的年月日是星期几
算法如下:
基姆拉尔森计算公式 [1] (C++与VB.Net整数除法和取余运算符不同)
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 //C++计算公式
W = (D + 2 * M + 3 * (M + 1) \ 5 + Y + Y \ 4 - Y \ 100 + Y \ 400+1) Mod 7 'VB.Net计算公式
在公式中d表示日期中的日数,m表示月份数,y表示年数。
w表示星期,w的取值范围是0~6,0代表星期日,1~6星期一到星期六。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
//y-年,m-月,d-日期 string CaculateWeekDay(int y,int m, int d) {if(m==1||m==2) {m+=12;y--;}int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;string weekstr="";switch(week){case 1: weekstr="星期一";break;case 2: weekstr="星期二";break;case 3: weekstr="星期三";break;case 4: weekstr="星期四";break;case 5: weekstr="星期五";break;case 6: weekstr="星期六";break;case 0: weekstr="星期日";break;}return weekstr; }
世纪末的星期(Java-蓝桥杯-省赛-T1)初学者详解相关推荐
- 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...
- 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...
- 2014年第五届蓝桥杯省赛试题及详解(Java本科A组)
蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分2分) 结果填空 (满分6分) 结果填空 (满分7分) 代码填空 (满分4分) 代码填空 (满分12分) 结果填空 (满分12分) 结果填空 (满分 ...
- 2018年第九届蓝桥杯省赛试题及详解(Java本科B组)
结果填空 (满分5分) 结果填空 (满分7分) 结果填空 (满分13分) 结果填空 (满分17分) 代码填空 (满分9分) 程序设计(满分11分) 程序设计(满分19分) 程序设计(满分21分) 程序 ...
- 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
- 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...
- 2017年 第8届 蓝桥杯 Java B组 省赛真题详解及总结
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
最新文章
- 【新产品发布】EVC9001 USB 隔离器
- cmake / aux_source_directory
- linux rpm 没有返回,容易忘记的linux命令之rpm
- C++与C语言中有关数组中元素排序
- MYSQL导出数据报错ERROR 1290 (HY000) 和 ERROR 1 (HY000)
- 5u以太网用交换机连接电脑_干货丨如何用自己的电脑直接连接NUS打印机
- UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte问题
- 【剑指 offer】(十四)—— 调整数组顺序使奇数位于偶数之前
- SWT: 发起事件 post event
- Linux使echo命令输出结果带颜色
- 硬原理——DC-DC升压(BOOST)电路原理
- Discuz安装短信宝短信插件教程
- GAS超标,以太坊告急
- Windows管理用户账号
- Java银联卡支付小系统
- 正斜杠 “/” 与反斜杠 “\”辨析
- 电影与幸福感期末答案和平时测试答案
- 第二证券|11天9板,“超级面料”概念火爆,高管却偷偷减持
- lyapunov直接法
- 关于2013年10大数字标牌行业发展趋势的预测与分析