• 完善例3.2的日期类MyDate


    实验要求:
    1.完善set()方法,保证获得正确的日期值;
    2.将tomorrow()和yestoday()方法合并为daysafter()方法,并增加一些方法:
    public int getweek() //返回当前日期对应的是星期几,范围0-6
    public String to WeekString() //返回当前日期对应星期几的中文字符串
    public boolean before(MyDate d) //判断是否在规定日期之前
    public int daysBetween(MyDate d) //返回当前日期与日期d之间相距的天数
    易混淆的点:
    1.类(引用数据类型)使用==、!=判断两个对象是否指向同一个实例,当两个对象引用同一个实例时,==结果为TURE,又因为引用数据类型无比较大小的概念,故不能使用<,<=,>,>=运算符;
    2.equals()和==的区别:前者用于比较同一类的两个对象的值是否相等,不需要引用同一实例。假设已有一个Date类,若定义Date d2=d1则属于对象赋值,两个对象引用同一个实例,d1==d2且d1.equals(d2)==1;若为Date d2=new Date(d1)则为d2引用由d1拷贝构造的实例,此时d1!=d2,但d1.equals(d2)仍为1。
    具体代码如下:
    public class MyDate {
    private int year,month,day;
    private static int thisYear;
    static {thisYear=2012;}
    public MyDate(int year,int month,int day){this.set(year,month,day);}
    public MyDate(){this(1970,1,1);}
    public MyDate(MyDate d){this.set(d);}
    public void set(int year,int month,int day){
    this.year=year;
    this.month=(month>=1&&month<=12)?month:1;
    this.day=(day>=1&&day<=31)?day:1;}
    public void set(MyDate d){
    set(d.year,d.month,d.day);}
    public int getYear(){
    return this.year;}
    public int getMonth(){
    return this.month;}
    public int getDay(){
    return this.day;
    }
    public String toString(){
    return year+"年"+String.format("%02d",month)+"月"+String.format("%02d",day)+"日";}
    public static int getThisYear(){
    return thisYear;}
    public static boolean isLeapYear(int year)//判断是否为闰年{
    return year%400==0||year%100!=0&&year%4==0;}
    public boolean isLeapYear(){
    return isLeapYear(this.year);}
    public boolean equals(MyDate d){
    return this==d||d!=null&&this.year==d.year&& this.month==d.month &&this.day==d.day;}
    public static int daysOfMonth(int year,int month){
    switch(month){
    case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
    case 4: case 6: case 9: case 11: return 30;
    case 2: return MyDate.isLeapYear(year)?29:28;
    default: return 0;}}
    public int daysofMonth(){
    return daysOfMonth(this.year,this.month);}
    public void tomorrow(){
    this.day++;
    if(this.day>this.daysofMonth()){
    this.day=1;
    this.month++;
    if(this.month>12){
    this.month=1;
    this.year++;}}}
    public MyDate yestoday(){
    MyDate date=new MyDate(this);
    date.day--;
    if(date.day==0){
    date.month--;
    if(date.month==0){
    date.month=12;
    date.year--;}
    date.day=daysOfMonth(date.year,date.month);}
    return date;}
    public int getWeek(){
    int i,j=0;
    for(i=0;i<this.year;i++){
    if(MyDate.isLeapYear(i))//静态访问
    j++;
    if(j>6)
    j=0;}
    for(i=0;i<this.month;i++){
    i+=MyDate.daysOfMonth(this.year, this.month);}
    j+=i%7;
    if(j>6)
    j-=7;
    return j;}
    public String toWeekString(){
    int i;
    i=getWeek(); //调用getweek函数判断当前为一周的第几天
    switch(i){
    case 0:return "星期一";
    case 1:return "星期二";
    case 2:return "星期三";
    case 3:return "星期四";
    case 4:return "星期五";
    case 5:return "星期六";
    case 6:return "星期天";}
    return null;}
    public boolean before(MyDate d){
    return d.year<this.year||d.month<this.month||d.day<this.day;}
    public int daysBetween(MyDate d)//先判断两个日期中间相差几年,再比较月份{
    int i,t=0,sum=0;
    if(this.before(d)){
    for(i=d.year;i<this.year;i++){
    if(isLeapYear(i))
    sum+=366;
    else
    sum+=365;}
    if(d.month<this.month)
    for(i=d.month;i<this.month;i++)
    sum+=daysOfMonth(this.year,i);
    else{
    for(i=this.month;i<d.month;i++)
    t+=daysOfMonth(this.year,i);
    sum-=t;}
    return sum;}
    for(i=this.year;i<d.year;i++){
    if(isLeapYear(i))
    sum+=366;
    else
    sum+=365;}
    if(this.month<d.month)
    for(i=this.month;i<d.month;i++)
    sum+=daysOfMonth(d.year,i);
    else{
    for(i=d.month;i<this.month;i++)
    t+=daysOfMonth(d.year,i);
    sum-=t;}
    return sum;}}
    class MyDate_ex{
    public static void main(String args[]){
    System.out.println("今年是"+MyDate.getThisYear()+",闰年?"+MyDate.isLeapYear(MyDate.getThisYear()));
    MyDate d1=new MyDate(2012,12,31);
    MyDate d2=new MyDate(d1);//调用拷贝构造方法复制实例
    MyDate d3=new MyDate(2013,12,31);
    System.out.println("d1: "+d1+",d2: "+d2+",d1==d2? "+(d1==d2)+", d1.equals(d2)? "+d1.equals(d2));//当且仅当两个对象引用同一个实例时两个对象恒等,而equals()比较的是两个对象对应成员变量的值是否相等
    System.out.print(d1+"的明天是 ");
    d1.tomorrow();
    System.out.println(d1+" "+d1+"的昨天是 "+(d2=d1.yestoday()));
    System.out.println(d1+"是 "+d1.toWeekString());
    if(d1.before(d3))
    System.out.println(d3+" 在 "+d1+"之前");
    else
    System.out.println(d1+" 在 "+d3+"之前");
    System.out.println(d1+"与"+d3+"相差"+d1.daysBetween(d3)+"天");}}

  • 相关阅读:
    oracle 将表名和字段名变为大写
    第三方应用软件提权
    数据库提权
    mybatis spring代理开发
    mybatis整合spring原始dao开发
    mybatis和spring整合的jar包准备
    mybatis整合ehcache(分布式缓存框架)
    mybatis 查询缓存
    mybatis 延迟加载
    mybatis 高级映射
  • 原文地址:https://www.cnblogs.com/such139-lala/p/6797240.html
Copyright © 2020-2023  润新知