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精选笔记_面向对象(慨念、类和对象)
面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...
随机推荐
- ubuntu 允许root用户登录到ssh
ubuntu的系统太太太麻烦了,我喜欢centos,但是还是要用ubuntu做东西,讨厌,装完系统以后,因为他不让你用root,我新建了一个wqz的用户名. 1.首先更新root的密码 sudo pa ...
- 主席树(可持久化线段树)静态区间第K小
传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+ ...
- express 应用创建及app.js详解
#1 express 应用创建 1.安装node.js (自行百度) 2.npm install express -g 3.全局安装express生成器 express-generator npm i ...
- 二十二、mysql 执行计划与存储引擎
1.explain(执行计划)中涉及的各字段理解1.1) select_type列的取值及含义: SIMPLE :简单的SELECT语句(不包括UNION操作或子 ...
- springboot后端时间到前端,相差8小时,时间格式不对
spring boot后台时间正确,返回给前台的时间不正确,和后台差8个小时 { "code": 1, "msg": "SUCCESS", ...
- 包装类和toString和static关键字
包装类 针对八种基本数据类型定义的引用类型. 有类的特点,可以调用类中的方法. 基本数据类型 包装类 boolean Boolean byte Byte short Short int Integer ...
- linux 添加与修改用户归属组
参考资源:https://cnzhx.net/blog/linux-add-user-to-group/ 一:已存在的用户 1.要以root进行登录 2.打开终端 3.修改分组 usermod -a ...
- W - Prime Time 素数判断+前缀和
W - Prime Time 题意:用公式n*n+n+41,判断素数的百分比 #include<iostream> #include<algorithm> #include&l ...
- Nginx解决服务器宕机问题
1.Nginx解决服务器宕机问题,Nginx配置服务器宕机策略,如果服务器宕机,会找下一台机器进行访问 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { ...
- Python函数-1 range()函数
range()函数 在其他语言中,如果想要循环一个变量从1到100,要怎么写呢? for(i = 1,i<=100,i++){} python怎么实现这个功能呢?python设计了range() ...