java学习-初级入门-面向对象⑤-类与对象-类与对象的定义和使用3
这次我们要做一个日期类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的更多相关文章
- java学习-初级入门-面向对象③-类与对象-类与对象的定义和使用1
今天学习类与对象.先大致解释一下类与对象的含义. 对象:object 有物体这一概念,一切皆对象(物体),对象由静态的属性和动态的行为组成. 比如说水杯: 水杯的静态属性:材质,容量,质量,颜色 动态 ...
- java学习-初级入门-面向对象②-面向对象概述-面向对象程序设计
我们在 面向对象①中学习了,结构化程序设计. 今天我们一起学习面向对象程序设计. 学习面向对象程序设计就要了解,在面向对象中重要的知识点. 继承 . 多态 . 抽象 . 接口 我们会在接下 ...
- java学习-初级入门-面向对象⑥-类与对象-静态static
这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...
- java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2
我们继续学习类与对象,上一篇我们定义了 坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...
- java学习-初级入门-面向对象①-面向对象概述-结构化程序设计
为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法
面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- Java精选笔记_面向对象(慨念、类和对象)
面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...
随机推荐
- 【Go语言系列】1.2、GO语言简介:哪些大公司正在使用Go语言
Go语言的强项在于它适合用来开发网络并发方面的服务,比如消息推送.监控.容器等,所以在高并发的项目上大多数公司会优先选择 Golang 作为开发语言. 1.Google 这个不用多做介绍,作为开发Go ...
- HDU5444 Elven Postman
按要求递归建树输出~ #include<cstdio> #include<algorithm> #include<cstring> using namespace ...
- MAC系统 - 系统目录结构
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/smstong/article/detai ...
- Python学习笔记010
倒三角 num2 = int(input("Line:")) while num2 > 0: num1 = num2 while num1 > 0: ...
- Python读取MNIST数据集
MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一.最早于1998年Yan Lecun在论文: Gradient-based learning applied to do ...
- 【PAT甲级】1052 Linked List Sorting (25 分)
题意: 输入一个正整数N(<=100000),和一个链表的头结点地址.接着输入N行,每行包括一个结点的地址,结点存放的值(-1e5~1e5),指向下一个结点的地址.地址由五位包含前导零的正整数组 ...
- 【PAT甲级】1051 Pop Sequence (25 分)(栈的模拟)
题意: 输入三个正整数M,N,K(<=1000),分别代表栈的容量,序列长度和输入序列的组数.接着输入K组出栈序列,输出是否可能以该序列的顺序出栈.数字1~N按照顺序随机入栈(入栈时机随机,未知 ...
- mcast_set_if函数
#include <errno.h> #include <string.h> #include <net/if.h> #include <sys/ioctl. ...
- 理解WPF中的视觉树和逻辑树
轉載地址:http://blog.csdn.net/changtianshuiyue/article/details/26981797 理解WPF中的视觉树和逻辑树 Understanding th ...
- 「AHOI2014/JSOI2014」骑士游戏
「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...