一、万年历

这个程序很好地说明了分治策略,因为在一开始过多地关注细节往往会阻碍解决问题的进程。所以最好是通过对一个大问题的逐步求解,得到最终的结果。

实现结果:

源代码如下:

import java.util.Scanner;
public class Text {public static boolean isLeapYear(int year) {//判断闰年if((year%4 == 0 && year%100 != 0) || (year%400 == 0))return true;else return false;}public static int daysOfMonthOfYear(int year, int month) {//每个月的天数int day = 0;switch (month) {case 1: case 3:case 5:case 7:case 8:case 10:case 12:day = 31;break;case 4: case 6:case 9:case 11:day = 30;break;case 2: if(isLeapYear(year)) {day = 29;} else {day = 28;}break;}return day;}public static int whatDayOfMonth(int year, int month) {int firstDay;//日历月份开始的星期int totalDays = 0;//计算和日历月份的第一天相差的总天数 for(int i=1900; i<year; i++) {//以1900年1月1日(星期一)为时间基点if(isLeapYear(i)) totalDays = totalDays + 366;else totalDays = totalDays + 365;}for(int j=1; j<month; j++)totalDays = totalDays + daysOfMonthOfYear(year, j);firstDay = (totalDays + 1) % 7;return firstDay;}public static void main(String[] args) {Scanner input=new Scanner(System.in);System.out.print("Enter full year(e.g.,2001):");int year=input.nextInt();System.out.print("Enter month in number between 1 and 12:");int month=input.nextInt();switch(month){case 1:System.out.println("\t\t\tJanuary "+year);break;case 2:System.out.println("\t\t\tFebruary "+year);break;case 3:System.out.println("\t\t\tMarch "+year);break;case 4:System.out.println("\t\t\tApril "+year);break;case 5:System.out.println("\t\t\tMay "+year);break;case 6:System.out.println("\t\t\tJune "+year);break;case 7:System.out.println("\t\t\tJuly "+year);break;case 8:System.out.println("\t\t\tAugust "+year);break;case 9:System.out.println("\t\t\tSeptember "+year);break;case 10:System.out.println("\t\t\tOctober "+year);break;case 11:System.out.println("\t\t\tNovember "+year);break;case 12:System.out.println("\t\t\tDecember "+year);}System.out.println("----------------------------------------------------");System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat\t");int times = 0;for(int i=0; i<whatDayOfMonth(year, month)&&whatDayOfMonth(year, month)!=6; i++) {System.out.print("\t");times++;}for(int j=1; j<=daysOfMonthOfYear(year, month); j++) {System.out.print(j + "\t");times++;if(times % 7 == 0) {System.out.println();}}       }
}

其中, firstDay = (totalDays + 1) % 7;  这个语句值得去思考。

记得要补充输出空格的条件 whatDayOfMonth(year, month)!=6 ,否则若第一天就是星期日将会输出7个空格再开始打印第一天。


二、Zeller公式

由于在万年历中理解求第一天的星期花了较长时间,且在做习题的时候看到了Zeller公式,于是也写了如何用Zeller公式求第一天的星期。

W=Y+[Y/4]+[C/4]-2C+[26×(M+1)/10]+D-1

实现结果:

源代码如下:

import java.util.Scanner;
public class Text {public static void main(String[] args) {Scanner input=new Scanner(System.in);int week,century,year,month,day,number;number=input.nextInt();century=number/100;//年份前两位year=number%100;//年份后两位month=input.nextInt();day=input.nextInt();if(month==1) {//1月2月分别看作上一年的13月14月month=13;if(year==0) {year=99;century-=1;}elseyear--;}else if(month==2) {month=14;if(year==0) {year=99;century-=1;}elseyear--;}week=(year+(int)(year/4)+(int)(century/4)-2*century+(int)(26*(month+1)/10)+day-1)%7;week=(week+7)%7;//注意负数的取模运算System.out.println(week);}
}

这个方法相对较好理解一些,在第一遍运行时代入几个日期都得到正确结果就以为是对的,但当代入2006年4月4日发现结果竟然是负数。这是因为没有对可能出现的负数进行取模运算(即结果加MOD再取余),导致有可能得到一个负的星期数。

修改后就得到正确的结果。

三、显示当前时间(用System.currentTimeMillis()

用了两种不同的方法来获得不同的当前时间:1、GMT:用了复杂的System.currentTimeMillis()2、CST:用了简单的java.util.Date()

实现结果:

源代码如下:

import java.util.Scanner;
public class Text {public static void main(String[] args) {long totalSeconds=System.currentTimeMillis()/1000;long currentSeconds=totalSeconds%60;long totalMinutes=totalSeconds/60;long currentMinutes=totalMinutes%60;long totalHours=totalMinutes/60;long currentHours=totalHours%24;long totalDays=totalHours/24;     long days=0;int year=1970;//Unix时间戳为1970年1月1日(星期四)for(;;year++) {//求得当前年份if(isLeapYear(year))if(366+days>=totalDays)break;elsedays+=366;elseif(365+days>=totalDays)break;elsedays+=365;}days=totalDays-days;//在当前年份,当前日期以前的天数String month;if(isLeapYear(year)) {if(days<=60&&days>=32) {month="February ";days-=31;}else if(days<=31)month="January ";else if(days<=91) {month="March ";days-=60;}else if(days<=121) {month="April ";days-=91;}else if(days<=152) {month="May ";days-=121;}else if(days<=182) {month="June ";days-=152;}else if(days<=213) {month="July ";days-=182;}else if(days<=244) {month="August ";days-=213;}else if(days<=274) {month="September ";days-=244;}else if(days<=305) {month="October ";days-=274;}else if(days<=335) {month="November ";days-=305;}else {month="December ";   days-=335;}}else {if(days<=59&&days>=32) {month="February ";days-=31;}else if(days<=31)month="January ";else if(days<=90) {month="March ";days-=59;}else if(days<=120) {month="April ";days-=90;}else if(days<=151) {month="May ";days-=120;}else if(days<=181) {month="June ";days-=151;}else if(days<=212) {month="July ";days-=181;}else if(days<=243) {month="August ";days-=212;}else if(days<=273) {month="September ";days-=243;}else if(days<=304) {month="October ";days-=273;}else if(days<=334) {month="November ";days-=304;}else {month="December ";    days-=334;}}System.out.println("Method1(GMT):Current date and time is "+month+(days+1)+","+year+" "+currentHours+":"+currentMinutes+":"+currentSeconds);java.util.Date currentDate=new java.util.Date();System.out.println("Method2(CST):Current date: "+currentDate.toString());}public static boolean isLeapYear(int year) {//判断闰年if((year%4 == 0 && year%100 != 0) || (year%400 == 0))return true;else return false;}}

代码看似很长,其实思想很简单,主要是求月份的那里占了很大一部分。第一次运行的时候日期不对,少了一天,是因为最后days的值是当前日之前的天数,所以当前日期的值要加一。

Java中几个关于时间的程序:万年历、Zeller公式、显示当前时间相关推荐

  1. java中int转换double类型_Java 程序将int类型变量转换为double

    Java 程序将int类型变量转换为double 在此程序中,我们将学习如何在Java中将整数(int)变量转换为double值. 要理解此示例,您应该了解以下Java编程主题: 示例1:使用类型转换 ...

  2. java中用于选择按钮的语句_java程序员考试套题1

    Java练习一 一.选择题 1.在Java中,下列()方法可以把JFrame对象jFrame的布局管理器设为FlowLayout 类型. A.jFrame.setLayout(new FlowLayo ...

  3. 关于JAVA中十进制转换二进制的小程序

    对于java中求二进制是将一个数分开成整数部分和小数部分,整数部分的按照除以2直到是0为止:小数部分是按照乘以2取整到0为止,对于特殊的小数就循环15次为止, 以下是代码: //十进制小数和整数的二进 ...

  4. MATLAB中出现 索引超出矩阵维度,程序用matlab运行显示索引超出矩阵维度,请问怎么...

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:程序用matlab运行显示索引超出矩阵维度,请问怎么改?回答:用size函数可以求矩阵维数,用reshape可以改变数据维数. 如: ...

  5. java中10d是什么意思_java程序员面试自我介绍

    java程序员面试自我介绍 当面试考官随便地问你:"谈谈你自己的情况如何?"这是面试中的第一个问题.此刻,你应把在此之前所有紧张不安的情绪稳定下来.因为这个问题,应试者已经做了充分 ...

  6. 如何在Java中使用Lombok删除样板安装程序获取器

    你好朋友, 一次又一次反对Java的观点之一是,我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码,不必要地增加了 我们代码的长度. 为了解决这个问题,有一个名为Proje ...

  7. java中的jgroup_JGroups实现聊天小程序

    本文实例为大家分享了JGroups实现聊天小程序的具体代码,供大家参考,具体内容如下 效果图: 代码部分: package com.lei.jgoups; import java.io.Buffere ...

  8. Java中利用JMF编写摄像头拍照程序

    摄像头拍照程序了.用于现场拍照,生成照片,主要用到Java Media Framework(JMF). 首先到SUN下载最新的JMF,然后安装. 然后,说一下需求 1. 用摄像头拍照 2. 在文本框输 ...

  9. java yyyy-mm-dd 毫秒_如何在Java中以YYYY-MM-DD HH:MI:秒毫秒格式获取当前时间?

    下面的代码为我提供了当前时间. 但这并不能说明毫秒. public static String getCurrentTimeStamp() { SimpleDateFormat sdfDate = n ...

  10. java中挂起和恢复,应用程序“未能及时恢复”并挂起

    事件标识符:6C33511B-7C9A-474C-B888-84A4FAFF6F91 CrashReporter密钥:93bbba4f690eb1b7638fa7a09a3ff3aa4e6872f4硬 ...

最新文章

  1. 机器人带陀螺仪走钢丝_Sphero RVR 一个无所不能的可编程机器人!
  2. MySQL面试题 | 附答案解析(五)
  3. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(7.2) 模块管理,模块的添加、修改、删除...
  4. python语法基础及if、while、for等语句介绍
  5. AndroidL分析之Keyguard
  6. mysql能否在手机端运行_在手机上安装linux并部署mysql,jupyter用于数据探索
  7. java bitset_Java BitSet nextClearBit()方法与示例
  8. 手机网页设计注意事项和解决方法
  9. 博文视点在SD2.0大会上以书会友
  10. XCode7 iOS8.X Simulator 离线下载地址
  11. 优酷、爱奇艺视频码率与YouTube视频码率
  12. 美智库:马赛克战是人工智能与自主系统支撑的决策中心战
  13. 软回车和硬回车 MS高级office
  14. 嵌入式系统 - 任务管理
  15. 指尖轻舞桌面:Slide On Desk - 主题风格制作指南
  16. 2022年十一届认证杯A题
  17. 在Java中将二进制数转化成十进制数
  18. 读论文:Self-Attention ConvLSTM for Spatiotemporal Prediction
  19. VoLTE的基本介绍
  20. 汉字的Unicode 内码

热门文章

  1. uniapp 视频遮挡顶部导航
  2. 学生信息管理系统(VB 干货篇三)
  3. 电子印章和签名WebSign的学习和应用1
  4. DIN 51509-1齿轮油粘度计算方法(直齿轮)
  5. 14 bs对象.节点名称.name attrs string 获取节点名称 属性 内容
  6. 马云高考数学仅1分?!数学的重要性绝对不止跟考试有关
  7. 射频、中频、基带拉远
  8. Java基础类(十二):BeanUtils类
  9. 记录集 执行mysql_mysql 多次查询后再执行记录集
  10. java pa——jsoup使用教程