这次我们要做一个日期类Date类

主要目的是    1.  熟悉-->构造不同参数的函数  2.善于利用已有的函数!!

题目要求:

Date类要求

可设定年月日

可转换为字符串,并可指定分隔符,默认为’-’

可获取若干天以前/后的日期

可计算与某个日期相隔的天数,日期的形式可能是日期对象,也可能是代表年月日的三个整数

可与某个日期比较大小,日期的形式同上

可计算星期几

解题思路

1.设置类的变量,并创建构造函数。

2.创建 日期转换字符串函数,  分别创建带参数,和不带参数的函数

3.计算若干天以前/后的日期,先把日期转换为天数,进行加减,在吧天数转换为日期

4.计算某个提起相隔的天数,可以把日期转换为天数,加减判断。  日期形式两种,这里就需要,多个构造函数(根据要求设置参数)

5.比较日期大小,  转化为天数比较

6.计算星期几,  天数%7的余数,就是星期数 。我们发现周日为0,这个时候就需要(天数-1)%7 +1  ,这样就避免了上述情况

java自身有Date函数,不过这次我们要自己创建。JAVA中的月份,星期几的表示方式有产别 (正常表示-1,因为是从0开始)

程序代码

 public class Date {
public int year;
public int month;
public int day;
public static String splitChar = "_"; /**
* 比较两个日期大小
* @param date 拿来比较的日期
* @return 0-等于 1-大于 -1-小于
*/
public byte compare(Date date) {
int n = off(date);
// 第一种判断方法
/*if (0==n){
return 0;
}
if(n > 0){
return 1;
}
return -1;*/ //第二种判断方法
return (byte)(0 == n?0:(n>0?1:-1));
} /**
* 计算与某个日期相隔的天数
* @param year 年 20xx形式
* @param month 月
* @param day 日
* @return 相隔的天数
*/
public int off(int year, int month, int day) {
Date date = new Date(year,month,day);
return off(date);
} /**
* 计算与某个日期相隔的天数
* @param date 相隔的日期 20xx-xx-xx形式
* @return 相隔的天数
*/
public int off(Date date) {
return this.getDays()-date.getDays();
} /**
* 获取若干天以前的日期
* @param days 天数
* @return 改变后的日期
*/
public Date before(int days) {
int n = this.getDays() - days; return new Date(n);
} /**
* 获取若干天以后的日期
* @param days 天数
* @return 改变后的日期
*/
public Date after(int days) {
int n = this.getDays() + days; return new Date(n);
} /**
* 计算当前日期为周几?
* @return 星期几
*/
public int weekday() {
int days = getDays();
return (byte)((days-1)%7+1);
} /**
* 将日期转换为字符
* @return 日期字符串形式 2014-12-08
*/
public String toStr() {
return toStr("-");
} /**
* 将日期转换为字符串
* @param splitChar 分割字符
* @return 日期字符串
*/
public String toStr(String splitChar) {
return String.format("%d%s%d%s%d",this.year,splitChar,this.month,splitChar,this.day);
} /**
* 构造函数
* @param year 年
* @param month 月
* @param day 日
*/
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
} /**
* 计算当前日期是历史上的第几天
* @return 天数
*/
public int getDays(){
int sum = day;
int monthday;
switch (month - 1 ){
case 12 :
monthday = 30;
sum += monthday;
case 11:
monthday = 30;
sum += monthday;
case 10:
monthday = 31;
sum += monthday;
case 9:
monthday = 30;
sum += monthday;
case 8:
monthday = 31;
sum += monthday;
case 7:
monthday = 31;
sum += monthday;
case 6:
monthday = 30;
sum += monthday;
case 5:
monthday = 31;
sum += monthday;
case 4:
monthday = 30;
sum += monthday;
case 3:
monthday = 31;
sum += monthday;
case 2:
monthday = isLeap(year)?29:28;
sum += monthday;
case 1:
monthday = 31;
sum += monthday;
} for (int year = this.year-1;year>=1;year-- ){
sum += isLeap(year)?366:365;
}
return sum;
} /**
* 构造函数
* @param days 天数
*/
public Date(int days){
/*
思路:
1.确定年份,逐年减去该年的天数,直到不够减
2.确定月份,逐月减去该月的天数,直到不够减
3.剩下的天数即为日
*/
year = 1;
while (true){
int n = isLeap(year)?366:365; //该年的天数
if(days < n){
break;
}
days -= n;
year++;
} int []mon = {31,28,31,30,31,30,31,31,30,31,30,31};
for (month=1;month<=12;month++){
// 该月的天数
int monthDay = mon[month-1];
if (2==month&&isLeap(year)){
monthDay ++;
}
if(days<monthDay){
break;
}
days -= monthDay;
}
day = days;
} /**
* 判断闰年
* @param year
* @return true-闰年 false-平年
*/
public boolean isLeap(int year){
return year%400==0||(year%4==0&&year%100!=0);
} }

测试类Test

 public class Test {
public static void main(String[] args) { Date date1 = new Date(2016,11,2); //设置日期1 2016-11-2
Date date2 = new Date(2017, 3,12); // 设置日期2 2017-3-12 System.out.printf("%s是星期%d\n",date1.toStr(),date1.weekday()); // 计算日期1是星期几
System.out.printf("%s是星期%d\n",date2.toStr(Date.splitChar),date2.weekday()); //计算日期2是星期几
//转换为字符串,指定分隔符 Date date3 = date1.after(50); // 日期3为, 日期1后50天
Date date4 = date1.before(50);     // 日期4为, 日期2前50天 int off1 = date3.off(date4); // 计算日期3 和 日期4相差多少天
System.out.printf("%s和%s相隔%d天\n",date3.toStr(),date4.toStr(),off1); int off2 = date3.off(2017,2,21); // 计算日期3 和 2017-2-21 相差多少天
System.out.printf("%s和2017-02-21相隔%d天\n",date3.toStr(),off2); byte result = date3.compare(date4); // 比较日期3 和 日期4 的大小关系
String relation = "";
switch (result){
case 0: relation = "等于" ; break;
case 1: relation = "大于" ; break;
case -1: relation = "小于" ; break;
}
System.out.printf("%s%s%s\n",date3.toStr(),relation,date4.toStr()); Date d = new Date(800); 计算公元第800天,是什么日期
System.out.println("今天是:"+d.toStr()); System.out.printf("今天是公元的第%d天\n",date3.getDays()); //输出日期3是公元的第几天
}
}

运行结果

心得体会

我们要善于运用 带参函数,这样同样功能的函数带不同参数时,解决不同的问题。

比如说计算两个日期多少天  1你可以参数设置为日期,直接与日期进行比较  2.你可以设置为具体的年月日,进行比较。

使用时很方便。

java学习-初级入门-面向对象⑤-类与对象-类与对象的定义和使用3的更多相关文章

  1. java学习-初级入门-面向对象③-类与对象-类与对象的定义和使用1

    今天学习类与对象.先大致解释一下类与对象的含义. 对象:object 有物体这一概念,一切皆对象(物体),对象由静态的属性和动态的行为组成. 比如说水杯: 水杯的静态属性:材质,容量,质量,颜色 动态 ...

  2. java学习-初级入门-面向对象②-面向对象概述-面向对象程序设计

    我们在  面向对象①中学习了,结构化程序设计. 今天我们一起学习面向对象程序设计. 学习面向对象程序设计就要了解,在面向对象中重要的知识点. 继承  .  多态   . 抽象  . 接口 我们会在接下 ...

  3. java学习-初级入门-面向对象⑥-类与对象-静态static

    这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...

  4. java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2

    我们继续学习类与对象,上一篇我们定义了  坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...

  5. java学习-初级入门-面向对象①-面向对象概述-结构化程序设计

    为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...

  6. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  7. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  8. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  9. Java精选笔记_面向对象(慨念、类和对象)

    面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...

随机推荐

  1. 计算机基础,Python - Map和Reduce

    例子1. python中实现hashable def __hash__(self): hashes = map(hash, self.components) return functools.redu ...

  2. 关于idea2019.2.3版本中文控制台乱码问题

    出现乱码后根据网上找的方法全都试过后还是显示乱码 更改VM Options为        -Dfile.encoding=UTF-8 添加备选字体 更改这两个文件 更改编码格式 以上这些方法全部设置 ...

  3. 5_4 反片语(UVa156)<map的使用>

    输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母不区分大小写,但在输出的时候保留输入时的大小写,按字典序进行排列. 样例输入: ...

  4. Java 9 New Features

    Java 9 概述 1. jdk 9 的发布.经过 4 次跳票,历经曲折的 java 9 终于终于在 2017 年 9 月 21 日发布. 2. Java 9 中哪些不得不说的新特性?java 9 提 ...

  5. XCOJ 1008: 级数求和

    1008: 级数求和 题目描述 已知:Sn= 1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K.现给出一个整数K(1<=k<=15),要求计算出一个最小 ...

  6. springBoot+MybatisPlus数据库字段使用驼峰命名法时报错

    假如有个实体类: package com.jeff.entity; public class User { /** * 主键id */ private Integer id; /** * 登陆名 */ ...

  7. cmd命令下载maven管理需要的依赖jar包

    首先在maven官网https://mvnrepository.com/  搜索你需要的jar包,找到下面的下载链接,在修改命令,然后cmd下载. cmd命令下载Maven需要jar包 cmd输入下面 ...

  8. T-SQL常用的函数

    http://blog.sina.com.cn/s/blog_4af01cd50100hsac.html

  9. SpringBoot与Mybatis-plus整合,代码生成mvc层

    一.添加pom依赖 <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifac ...

  10. php的弱类型比较

    1.==和=== ==为弱相等,也就是说12=="12" --> true,而且12=="12cdf" --> true,只取字符串中开头的整数部分 ...