day5 5 java日期的操作及格式控制

5、java日期的操作及格式控制

1.系统时间及日历

在 Java 中获取当前时间,可以使用 java.util.Date 类和 java.util.Calendar 类完成。其中,Date 类主要封装了系统的日期和时间的信息,Calendar 类则会根据系统的日历来解释 Date 对象。下面详细介绍这两个类的具体使用。

1.1 Date类

Date 类表示系统当前的时间,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。
1.构造方法解析
Date 类有如下两个构造方法。

  1. Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
  2. Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。与CST(中央标准时间)相差8个小时,1970年1月1日8时0分0点开始
    例子:
package java基础;
import java.util.Date;
import java.util.Scanner;


/**
 * 目的:演示日期类的使用
 * 相关日期类Data
 */

public class DataDemo {
    public static void main(String[]args){
        Date dt1 = new Date();//采用的是国家标准格式CST(Center Standard Time) ,分配一个Date对象并初始化它,使它表示分配它的时间,测量到最近的毫秒。就是当前系统时间
        System.out.println(dt1.toString());

        //构造方法2.参数表示距离基准时间过了多少毫秒。GMT与CST相差8小时
        Date dt2 = new Date(60000);//分配一个Date对象并初始化它,使其表示自标准基准时间“epoch”(即1970年1月1日00:00:00 GMT)以来指定的毫秒数。
        System.out.println(dt2.toString());
		
		//开始演示例子
        //接受用户输入的事件
        Scanner  sc = new Scanner(System.in);
        //1.输入你要办的时间与日期
        System.out.println("请输入事件:");
        String staff = sc.next();
        //获取当前时间
        Date now_da = new Date();
        System.out.println("你要办的事件为:"+staff+",发生的时间是"+now_da);


        //模拟时间流逝,采用延时
        try{
            Thread.sleep(60000);//延时1分钟
        }catch (InterruptedException e) {
            e.printStackTrace();
        }

        //获取当前时间,before判断时间的前后,使用getTime()来计算时间差值。计算的是毫秒,必须除以1000
        Date date2 = new Date();
        System.out.println("现在时间为:" + date2);
        if (date2.before(now_da)) {
            System.out.println("你还有 " + (date2.getTime() - now_da.getTime()) / 1000 + " 秒需要去完成【" + staff + "】这件事!");
        } else {
            System.out.println("【" + staff + "】事情已经过去了 " + (date2.getTime() - now_da.getTime()) / 1000 + " 秒");
        }
    }
}

运行结果:打了一分钟篮球😜
在这里插入图片描述
我们来了解一下data之前的构造函数(有一些被抛弃的,并分离到Calendar类里边)
在这里插入图片描述
可见确实只剩下两个构造函数了。

1.2 Calendar类(抽象类)

Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。

创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

Calendar c = Calendar.getInstance();

当创建了一个 Calendar 对象后,就可以通过 Calendar 对象中的一些方法来处理日期、时间。Calendar 类的常用方法如表 2 所示。

方法描述
void add(int field, int amount)根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount
boolean after(Object when)判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果
boolean before(Object when)判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果
void clear()清空 Calendar 中的日期时间值
int compareTo(Calendar anotherCalendar)比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0
int get(int field)返回指定日历字段的值
int getActualMaximum(int field)返回指定日历字段可能拥有的最大值
int getActualMinimum(int field)返回指定日历字段可能拥有的最小值
int getFirstDayOfWeek()获取一星期的第一天。根据不同的国家地区,返回不同的值
static Calendar getInstance()使用默认时区和语言坏境获得一个日历
static Calendar getInstance(TimeZone zone)使用指定时区和默认语言环境获得一个日历
static Calendar getInstance(TimeZone zone,Locale aLocale)使用指定时区和语言环境获得一个日历
Date getTime()返回一个表示此 Calendar 时间值(从格林威治时间 1970 年 01 月 01 日 00 时00 分 00 秒至现在的毫秒偏移量)的 Date 对象
long getTimeInMillis()返回此 Calendar 的时间值,以毫秒为单位
void set(int field, int value)为指定的日历字段设置给定值
void set(int year, int month, int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
void set(int year, int month, int date, int hourOfDay,int minute, int second)设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值
void setFirstDayOfWeek(int value)设置一星期的第一天是哪一天
void setTimeInMillis(long millis)用给定的 long 值设置此 Calendar 的当前时间值

Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静态常量指定。

静态常量

Calendar 类中定义了许多常量,分别表示不同的意义。

常量名意义
Calendar.YEAR年份。
Calendar.MONTH月份。
Calendar.DATE日期。
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同。
Calendar.HOUR12小时制的小时。
Calendar.HOUR_OF_DAY24 小时制的小时。
Calendar.MINUTE分钟。
Calendar.SECOND秒。
Calendar.DAY_OF_WEEK星期几。

例如,要获取当前月份可用如下代码:

int month = Calendar.getInstance().get(Calendar.MONTH);

注意:如果整型变量 month 的值是 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12 月份。就是要加一

使用 Calendar 类处理日期时间方法如下:

Calendar calendar = Calendar.getInstance(); // 如果不设置时间,则默认为当前时间
calendar.setTime(new Date()); // 将系统当前时间赋值给 Calendar 对象
System.out.println("现在时刻:" + calendar.getTime()); // 获取当前时间
int year = calendar.get(Calendar.YEAR); // 获取当前年份
System.out.println("现在是" + year + "年");
int month = calendar.get(Calendar.MONTH) + 1; // 获取当前月份(月份从 0 开始,所以加 1)
System.out.print(month + "月");
int day = calendar.get(Calendar.DATE); // 获取日
System.out.print(day + "日");
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日为第一天)
System.out.print("星期" + week);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
System.out.print(minute + "分");
int second = calendar.get(Calendar.SECOND); // 获取当前秒数
System.out.print(second + "秒");
int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
System.out.print(millisecond + "毫秒");
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");
int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2012-8-8 后的时间:" + c.getTime()); // 输出时间

1.3 Demo演示创建2019年的日历

需求:根据用户输入的月份,查看2019年对应月份的日历

package java基础;

import java.util.Calendar;
import java.util.Scanner;

/**
 * 需求:根据用户输入的月份,查询2019年对应月份的日历
 */

public class Demo_2019Calendar {
    public static void main(String[]args){
        //创建日历对象
        Calendar year_calendar = Calendar.getInstance();
        //设置为2019年1月1日
        year_calendar.set(2019,0,1);//实际的calendar对象所表示的日期为2019年1月1日

        //开始计算对应月份的日历

        //月份对应的天数
        int []day_num = new int[3];
        day_num[0] = 28;
        day_num[1] = 30;
        day_num[2] = 31;
        System.out.println("请输入你想要查看的月份");
        Scanner sc = new Scanner(System.in);
        int month = sc.nextInt();
        if(month<1||month>12)//输入的月份不合格默认输出一月
            month = 1;
        int num =JudgeMonth(month,day_num);

        //设定星期几
        char[] title = {'日','一','二','三','四','五','六'};

        //定义二维数组,存储对应的日历
        int [][]dayArray = new int[6][7];//最多能排7行。
        //我们获取1号是星期几先
        int index = year_calendar.get(Calendar.DAY_OF_WEEK) - 1;
        //定义一个day记录打印的天数
        int day = 0;
        for (int i = index; i < 7; i++) {
            // 填充第一周的日期数据,即日历中的第一行
            dayArray[0][i] = ++day;
        }
        for(int i=1;i<6;i++){
            for(int j=0;j<7;j++){
                if(day>num){
                    i = 6;//直接退出。
                    break;
                }
                dayArray[i][j] = day;
                day++;
            }
        }

        //开始打印日历
        System.out.println("------2019 年 "+month+" 月--------\n");
        //打印星期几
        for (int i = 0; i < 7; i++) {
            System.out.print(title[i] + "\t");
        }
        System.out.print("\n");

        // 输出二元数组daysArray中的元素
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 7; j++) {
                if (dayArray[i][j] == 0) {
                    if (i != 0) {
                        // 到月末,则完成显示日历的任务,停止该方法的执行
                        return;
                    }
                    System.out.print("\t");
                    continue;
                }
                System.out.print(dayArray[i][j] + "\t");
            }
            System.out.print("\n");


        }

    }

    //定义一个函数用于判断该月是几天
    public static int JudgeMonth(int month,int[]day_num) {
        //小于等于7月,奇月有31天
        if (month < 8) {
            if (month % 2 != 0)//奇数
                return day_num[2];
            else if (month != 2)//不是2月的偶数
                return day_num[1];
            else return day_num[0];
        } else {
            if (month % 2 == 0)
                return day_num[2];
            else
                return day_num[1];
        }
    }

}

运行结果:
在这里插入图片描述
在这里插入图片描述

2.日期的格式化

格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如将日期“Fri May 18 15:46:24 CST2016” 格式转换为 “2016-5-18 15:46:24 星期五”的格式。

在 Java 中,可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期,下面详细介绍这两个格式化日期类的使用。

2.1 DateFormat 类(抽象类)

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期→文本)、解析(文本→日期)和标准化日期。

在创建 DateFormat 对象时不能使用 new 关键字,而应该使用 DateFormat 类中的静态方法 getDateInstance(),示例代码如下:

DateFormat df = DateFormat.getDatelnstance();

在创建了一个 DateFormat 对象后,可以调用该对象中的方法来对日期/时间进行格式化。DateFormat 类中常用方法如表 1 所示。

方法描述
String format(Date date)将 Date 格式化日期/时间字符串
Calendar getCalendar()获取与此日期/时间格式相关联的日历
static DateFormat getDateInstance()获取具有默认格式化风格和默认语言环境的日期格式
static DateFormat getDateInstance(int style)获取具有指定格式化风格和默认语言环境的日期格式
static DateFormat getDateInstance(int style,Locale locale)获取具有指定格式化风格和指定语言环境的日期格式
static DateFormat getDateTimeInstance()获取具有默认格式化风格和默认语言环境的日期/时间格式
static DateFormat getDateTimeInstance(intdateStyle,int timeStyle)获取具有指定日期/时间格式化风格和默认语言环境的日期/时间格式
static DateFormat getDateTimeInstance(int dateStyle,int timeStyle,Locale locale)获取具有指定日期/时间格式化风格和指定语言环境的日期/时间格式
static DateFormat getTimeInstance()获取具有默认格式化风格和默认语言环境的时间格式
static DateFormat getTimeInstance(int style)获取具有指定格式化风格和默认语言环境的时间格式
static DateFormat getTimeInstance(int style,Locale locale)获取具有指定格式化风格和指定语言环境的时间格式
void setCalendar(Calendar newCalendar)为此格式设置日历
Date parse(String source)将给定的字符串解析成日期/时间

格式化样式主要通过 DateFormat 常量设置。将不同的常量传入到表 1 所示的方法中,以控制结果的长度。DateFormat 类的常量如下。

常量形式
SHORT完全为数字,如 12.5.10 或 5:30pm。
MEDIUM较长,如 May 10,2016。
LONG更长,如 May 12,2016 或 11:15:32am。
FULL是完全指定,如 Tuesday、May 10、2012 AD 或 11:l5:42am CST。

使用 DateFormat 类格式化曰期/时间的示例如下:

package java基础;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormat_demo {
    public static void main(String[]args){
        // 获取不同格式化风格和中国环境的日期,就是日期的格式,不含多少点
        DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
        DateFormat df2 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
        DateFormat df3 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
        DateFormat df4 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
// 获取不同格式化风格和中国环境的时间,就是几点几点,不含日期
        DateFormat df5 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
        DateFormat df6 = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
        DateFormat df7 = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
        DateFormat df8 = DateFormat.getTimeInstance(DateFormat.LONG, Locale.CHINA);
// 将不同格式化风格的日期格式化为日期字符串,
        String date1 = df1.format(new Date());
        String date2 = df2.format(new Date());
        String date3 = df3.format(new Date());
        String date4 = df4.format(new Date());
// 将不同格式化风格的时间格式化为时间字符串
        String time1 = df5.format(new Date());
        String time2 = df6.format(new Date());
        String time3 = df7.format(new Date());
        String time4 = df8.format(new Date());
// 输出日期
        System.out.println("SHORT:" + date1 + " " + time1);
        System.out.println("FULL:" + date2 + " " + time2);
        System.out.println("MEDIUM:" + date3 + " " + time3);
        System.out.println("LONG:" + date4 + " " + time4);
    }
}

运行该段代码,输出的结果如下:

在这里插入图片描述

该示例主要介绍了 DateFormat 类中方法与常量的结合使用,通过使用 DateFomat 类可以对日期进行不同风格的格式化。

2.2 SimpleDateFormat类(DateFormat子类)

如果使用 DateFormat 类格式化日期/时间并不能满足要求,那么就需要使用 DateFormat 类的子类——SimpleDateFormat。

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类,它允许进行格式化(日期→文本)、解析(文本→日期)和规范化。SimpleDateFormat 使得可以选择任何用户定义的日期/时间格式的模式。

SimpleDateFormat 类主要有如下 3 种构造方法。

SimpleDateFormat():用默认的格式和默认的语言环境构造 SimpleDateFormat。
SimpleDateFormat(String pattern):用指定的格式和默认的语言环境构造 SimpleDateF ormat。
SimpleDateFormat(String pattern,Locale locale):用指定的格式和指定的语言环境构造 SimpleDateF ormat。

SimpleDateFormat 自定义格式中常用的字母及含义如表 2 所示。

字母含义示例
y年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份使用 yy 表示的年扮,如 11;使用 yyyy 表示的年份,如 2011
M月份。一般用 MM 表示月份,如果使用 MMM,则会根据语言环境显示不同语言的月份使用 MM 表示的月份,如 05;使用 MMM 表示月份,在 Locale.CHINA语言环境下,如“十月”;在 Locale.US语言环境下,如 Oct
d月份中的天数。一般用 dd 表示天数使用 dd 表示的天数,如 10
D年份中的天数。表示当天是当年的第几天, 用 D 表示使用 D 表示的年份中的天数,如 295
E星期几。用 E 表示,会根据语言环境的不同, 显示不同语言的星期几使用 E 表示星期几,在 Locale.CHINA 语言环境下,如“星期四”;在 Locale.US 语言环境下,如 Thu
H一天中的小时数(0~23)。一般用 HH 表示小时数使用 HH 表示的小时数,如 18
h一天中的小时数(1~12)。一般使用 hh 表示小时数使用 hh 表示的小时数,如 10 (注意 10 有可能是 10 点,也可能是 22 点)
m分钟数。一般使用 mm 表示分钟数使用 mm 表示的分钟数,如 29
s秒数。一般使用 ss 表示秒数使用 ss 表示的秒数,如 38
S毫秒数。一般使用 SSS 表示毫秒数使用 SSS 表示的毫秒数,如 156

例 1
编写 Java 程序,使用 SimpleDateFormat 类格式化当前日期并打印,日期格式为“xxxx 年 xx 月 xx 日星期 xxx 点 xx 分 xx 秒”,具体的实现代码如下:

package java基础;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormat_Demo {
        public static void main(String[] args) {
            Date now = new Date(); // 创建一个Date对象,获取当前时间
            // 指定格式化格式
            SimpleDateFormat f = new SimpleDateFormat("今天是 " + "yyyy 年 MM 月 dd 日 E HH 点 mm 分 ss 秒");
            System.out.println(f.format(now)); // 将当前时间袼式化为指定的格式
        }

}

该程序的运行结果如下:
在这里插入图片描述

2.3 Test 测试日期查询

本实例使用有关日期处理和日期格式化的类实现一个日期查询的功能,即

  1. 查询指定日期所在周的周一日期;
  2. 两个指定日期间相差的天数;
  3. 指定日期为所在周的星期几的日期 ;

3 个功能。

设计思路:

1)用Exercise类实现上述三个功能

1.1 查询指定日期所在周的周一——getMonday()

 /**
     * 需求:定义获取指定日期所在周的周一日期的方法——getMonday()
     *
     * Date 类型的参数,返回值为string类型
     *
     */
    public static String getMonday(Date date) {
        //创建实例对象
        Calendar c = Calendar.getInstance();
        //设置为当前的日期
        c.setTime(date);
        //获取星期一
        c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);

        //格式化返回
        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    }

1.2 查询对应两个输入日期的相差的天数——getTwoday()

 /**
     * 需求:定义获取两个日期间相差天数的方法——getTwoDay()
     *  该方法需要传递两个 String 类型的参数。
     *
     */
    public static int getTwoDay(String sj1, String sj2) {
        SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
        int day;
        try {
            Date date = myFormatter.parse(sj1);
            Date mydate = myFormatter.parse(sj2);
            // 计算两个日期间相差的天数
            day = (int)((date.getTime()-mydate.getTime())/(24*60*60*1000));
        } catch(Exception e) {
            return 0;
        }
        return day;
    }

1.3 根据用户输入的值输出指定日期为所在周的星期几的日期——getWeek()

/**
     * 需求:定义获取指定日期所在周的指定星期的日期方法——getWeek(),获得一个日期所在周的星期几的日期,如要找出2011年5月1日所在周的星期一是几号
     *  该方法需要传递两个 String 类型的参数,其中第一个参数表示指定的日期,第二个参数表示星期几。
     *    sdate所确定的日期形式2011-05-01
     *   num要确定的是周几(1表示周一,2表示周二)
     */
    public static String getWeek(String sdate, String num) {
        // 调用StrToDate方法转化sdate
        Date dd = StrToDate(sdate);
        //创建实例Calendar
        Calendar c = Calendar.getInstance();
        c.setTime(dd);
        int weekNo = Integer.parseInt(num);
        switch (weekNo) {
            case 1:
                c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);    //返回星期一所在的日期
                break;
            case 2:
                c.set(Calendar.DAY_OF_WEEK,Calendar.TUESDAY);    //返回星期二所在的日期
                break;
            case 3:
                c.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);    //返回星期三所在的日期
                break;
            case 4:
                c.set(Calendar.DAY_OF_WEEK,Calendar.THURSDAY);    //返回星期四所在的日期
                break;
            case 5:
                c.set(Calendar.DAY_OF_WEEK,Calendar.FRIDAY);    //返回星期五所在的日期
                break;
            case 6:
                c.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY);    //返回星期六所在的曰期
                break;
            case 7:
                c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);    //返回星期曰所在的日期
                break;
        }
        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    }

1.4 定义两个方法实现date与string的转化——StrToDate()及DateToStr()

 /**
     * 需求:创建两个静态方法,分别完成 String 类型的日期与 Date 类型日期的互换功能。
     */
    public static Date StrToDate(String strDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(strDate);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    public static String DateToStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        return sdf.format(date);
    }

完整的Exercise类:

package 日期查询Demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 需求:创建一个类实现三个功能:
 *         1.获取指定日期所在周的周一日期、
 *         2.获取两个指定日期的相差天数、
 *         3.获取指定日期为所在周的星期几的日期这 3 个功能
 *     同时定义 Date 类型的日期与 String 类型之间的转换方法。
 * @author Lh
 * @version 1.0.0
 */

public class Exercise {

    /**
     * 需求:定义获取指定日期所在周的周一日期的方法——getMonday()
     *
     * Date 类型的参数,返回值为string类型
     *
     */
    public static String getMonday(Date date) {
        //创建实例对象
        Calendar c = Calendar.getInstance();
        //设置为当前的日期
        c.setTime(date);
        //获取星期一
        c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);

        //格式化返回
        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    }
    /**
     * 需求:定义获取两个日期间相差天数的方法——getTwoDay()
     *  该方法需要传递两个 String 类型的参数。
     *
     */
    public static int getTwoDay(String sj1, String sj2) {
        SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
        int day;
        try {
            Date date = myFormatter.parse(sj1);
            Date mydate = myFormatter.parse(sj2);
            // 计算两个日期间相差的天数
            day = (int)((date.getTime()-mydate.getTime())/(24*60*60*1000));
        } catch(Exception e) {
            return 0;
        }
        return day;
    }

    /**
     * 需求:创建两个静态方法,分别完成 String 类型的日期与 Date 类型日期的互换功能。
     */
    public static Date StrToDate(String strDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(strDate);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    public static String DateToStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        return sdf.format(date);
    }


    /**
     * 需求:定义获取指定日期所在周的指定星期的日期方法——getWeek(),获得一个日期所在周的星期几的日期,如要找出2011年5月1日所在周的星期一是几号
     *  该方法需要传递两个 String 类型的参数,其中第一个参数表示指定的日期,第二个参数表示星期几。
     *    sdate所确定的日期形式2011-05-01
     *   num要确定的是周几(1表示周一,2表示周二)
     */
    public static String getWeek(String sdate, String num) {
        // 调用strToDate方法转化sdate
        Date dd = StrToDate(sdate);
        //创建实例Calendar
        Calendar c = Calendar.getInstance();
        c.setTime(dd);
        int weekNo = Integer.parseInt(num);
        switch (weekNo) {
            case 1:
                c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);    //返回星期一所在的日期
                break;
            case 2:
                c.set(Calendar.DAY_OF_WEEK,Calendar.TUESDAY);    //返回星期二所在的日期
                break;
            case 3:
                c.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);    //返回星期三所在的日期
                break;
            case 4:
                c.set(Calendar.DAY_OF_WEEK,Calendar.THURSDAY);    //返回星期四所在的日期
                break;
            case 5:
                c.set(Calendar.DAY_OF_WEEK,Calendar.FRIDAY);    //返回星期五所在的日期
                break;
            case 6:
                c.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY);    //返回星期六所在的曰期
                break;
            case 7:
                c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);    //返回星期曰所在的日期
                break;
        }
        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    }


}

2)定义一个Test类来测试

package 日期查询Demo;
import java.util.Date;
import java.util.Scanner;
//import 日期查询Demo.Exercise;如果是同级目录下可以不用导入
public class Test {
    public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            Date date = new Date();
            String monday = Exercise.getMonday(date);
            System.out.print("这周一的日期为【"+monday+"】,");
            String nowStr = Exercise.DateToStr(date);       // 将 Date 类型的日期转换为 String 类型
            int num = Exercise.getTwoDay(nowStr,monday);
            System.out.print("与今天相差【"+num+"】天");

            System.out.println("\n请输入您要查询本周星期几的日期(1表示星期一,2表示星期二…7表示星期日):");
            String weekNo = input.next();       //获取用户输入的星期
            int no = Integer.parseInt(weekNo);
            //将用户输入的星期转换为int类型,以便使用switch语句
            String strWeekNo = "";
            switch(no) {
                case 1:
                    strWeekNo = "星期一";
                    break;
                case 2:
                    strWeekNo = "星期二";
                    break;
                case 3:
                    strWeekNo = "星期三";
                    break;
                case 4:
                    strWeekNo = "星期四";
                    break;
                case 5:
                    strWeekNo = "星期五";
                    break;
                case 6:
                    strWeekNo = "星期六";
                    break;
                case 7:
                    strWeekNo = "星期日";
                    break;
            }
            System.out.println("本周【"+strWeekNo+"】的日期为:"+Exercise.getWeek(nowStr,weekNo));
    }
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜※繁华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值