Date、DateFormat和Calendar

2020-06-14  本文已影响0人  dotaer_shashen

目录
Date
​-------Date类的构造函数
​-------Date类中的常用方法
DateFormatSimple
-------DateFormat的构造函数
-------SimpleDteFormat常用的函数
Calendar
-------GregorianCalendar对象的获取方式
-------Calendar类的常用方法
-------Calendar使用中的问题
--------------代码示例
--------------原因分析
--------------解决方案(DateTimeUtils)
时间处理相关的工具类DateTimeUtils

Date

Date类是java.util包下表示日期的类, 精确到毫秒值;

Date类的构造函数:

// 用来创建当前系统时间对应的日期对象
public Date() {
    this(System.currentTimeMillis());
}

// 用来创建以标准基准时间为基准,指定偏移毫秒数,对应的日期对象 参数单位:毫秒
    // 标准基准时间:
        // 0时区: 1970年01月01日 00:00:00
        // 东八区: 1970年01月01日 08:00:00
public Date(long date) {
    fastTime = date;
}

示例代码:

public class DateTest {
    public static void main(String[] args) {
        // 创建一个当前系统时间的日期对象
        Date date01 = new Date();
        System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020
        
        // 创建一个与标准基准时间偏移了1秒的日期对象
        Date date02 = new Date(1000);
        System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970
    }
}

Date类中的常用方法

  • long getTime() 获取当前日期对 象距离标准基准时间的毫秒数
  • void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒数
  • boolean after(Date when) 测试此日期是否在指定日期之后
  • boolean before(Date when) 测试此日期是否在指定日期之前
public class DateTest {
    public static void main(String[] args) {
        // 创建一个当前系统时间的日期对象
        Date date01 = new Date();
        System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020

        // 创建一个与标准基准时间偏移了1秒的日期对象
        Date date02 = new Date(1000);
        System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970

        // 获取
        System.out.println(date01.getTime()); // 1592121661184
        System.out.println(date02.getTime()); // 1000

        // 设置:
        date01.setTime(2000);
        System.out.println(date01);// Thu Jan 01 08:00:02 CST 1970
        System.out.println(date01.getTime());// 2000

        date02.setTime(3000);
        System.out.println(date02);// Thu Jan 01 08:00:03 CST 1970
        System.out.println(date02.getTime());// 3000

        System.out.println(date01.after(date02));  // false
        System.out.println(date01.before(date02)); // true
    }
}

DateFormat

DateFormat是一个表示日期格式化的类, 是抽象类, 一般使用其子类 SimpleDateFormat;
DateFormat的作用: 实现日期与文本之间的相互转化;
​ String ----> Date;
​ Date ----> String;

SimpleDateFormat的构造函数

// 参数 pattern:是String类型,用来指定日期的格式
// pattern的格式规则
//        y   年
//        M   月
//        d   日
//        H   时
//        m   分
//        s   秒
//        常用的日期格式: yyyy年MM月dd日  HH时mm分ss秒
//        常用的日期格式: yyyy-MM-dd  HH:mm:ss
public SimpleDateFormat(String pattern){
    this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}

SimpleDteFormat常用的函数

  • String format(Date date); // 格式化
  • Date parse(String source); // 解析

需要注意: 解析的时候,字符串日期格式一定要和日期格式化对象指定的日期格式一致;

代码示例:

public class DateFormatTest {
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
        // 格式化
        System.out.println(sdf1.format(date)); // 2020年06月14日 16时31分50秒
        System.out.println(sdf2.format(date)); // 2020-06-14 16:31:50
        System.out.println(sdf3.format(date)); // 2020-06-14

        try {
            // 解析
            Date dateP = sdf1.parse("2020年06月14日 16时31分50秒");
            System.out.println(dateP); // Sun Jun 14 16:31:50 CST 2020
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Calendar

Calendar类表示日历, 是一个抽象类, 一般使用其子类 GregorianCalendar;

GregorianCalendar对象的获取方式

public class CalendarTest {
    public static void main(String[] args) {
        // 1.通过GregorianCalendar()的构造函数获了
        Calendar calendar01 = new GregorianCalendar();
        // 2.通过Calendar.getInstance()函数获取
        Calendar calendar02 = Calendar.getInstance();
        System.out.println(calendar01.getClass().getName());//java.util.GregorianCalendar
        System.out.println(calendar02.getClass().getName());//java.util.GregorianCalendar
    
        // 两种方式获取到的是同一类对象(GregorianCalendar);
    }
}

Calendar类的常用方法

  • public int get(int field); // 获取某个字段的值

参数: 表示获取哪个字段的值,可以使用Calender中定义的常量来指定

  • Calendar.YEAR: 年龄
  • Calendar.MONTH :月
  • Calendar.DAY_OF_MONTH:月中的日期
  • Calendar.HOUR:小时
  • Calendar.MINUTE:分钟
  • Calendar.SECOND:秒
  • Calendar.DAY_OF_WEEK:星期
  • public void set(int field,int value); // 设置某个字段的值;
  • public void add(int field,int amount); // 为某个字段增加/减少指定的值;
  • void setTime(Date date); // 使用给定的 Date 设置此 Calendar 的时间;
  • boolean before(Object when);

// 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果;

  • boolean after(Object when);

// 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果;

需要注意:

代码示例

public class CalendarTest {
    public static void main(String[] args) {
        Calendar calendar = new GregorianCalendar();
        System.out.println(calendar.get(Calendar.YEAR)); // 2020
        System.out.println(calendar.get(Calendar.MONTH)); // 5
        System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 25
        System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 3

        calendar.set(Calendar.YEAR, 1999);
        System.out.println(calendar.get(Calendar.YEAR));// 1999

        calendar.add(Calendar.YEAR, 2);
        System.out.println(calendar.get(Calendar.YEAR));// 2001

        // 创建一个距离标准基准时间1小时的日期对象
        Date date = new Date(1 * 60 * 60 * 1000);
        // 调用日历对象的setTime方法,设置日历对象表示的日期
        calendar.setTime(date);
//        System.out.println(calendar);// 距离标准基准时间1小时的日期对应的日历对象
        System.out.println(calendar.get(Calendar.YEAR)); // 1970
        System.out.println(calendar.get(Calendar.MONTH)); // 0 
        System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 1
        System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 1


        Calendar cal2 = Calendar.getInstance();
        // calendar: 距离标准基准时间1小时的日期对象
        // cal3: 当前时间的日历对象
        System.out.println(calendar.before(cal2));// true
        System.out.println(calendar.after(cal2));// true
    }
}

Calendar使用中的问题

代码示例
public class CalendarTest {
    public static void main(String[] args) throws ParseException {
        // 需求是希望把"2018-03-31"改为"2018-02-01";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(format.parse("2018-03-31"));
        calendar.set(Calendar.YEAR,2018);
        calendar.set(Calendar.MONTH,1);
       
        String DateStr = format.format(calendar.getTime());
        System.out.println(DateStr);// 2018-03-03
    }
}
原因分析

Calendar类中的时间计算, 是以毫秒数来计算的, 上面的代码设置只是把月份变动了, 但是天数并没有变, 也就是说上面的代码实际上是表示打印"2018-02-31";
而2月份是没有31号的, 并且2018年的2月份只有28号, 所以就往后加了三天, 最终的打印结果就变成了"2018-03-03";
如果把2018改成2016, 那么打印出来的结果就是"2016-03-02", 因为2016年的2月份是29号;

解决方案(DateTimeUtils)
  • 主动set日期;
  • 清除日历对象所有数据;
  • 根据年月, 去获取日期的最大值;

时间处理相关的工具类DateTimeUtils

public class DateTimeUtil {
    public final static String PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";
    public final static String PATTERN_LONG2 = "yyyyMMdd HH:mm:ss";
    public final static String PATTERN_A = "yyyyMM";
    public final static String PATTERN_B = "yyyyMMdd";
    public final static String PATTERN_C = "yyyy-MM-dd";
    public static final String PATTERN_D = "yyMMdd";
    public final static String PATTERN_ZH = "yyyy年MM月dd日";
    public final static String PATTERN_ZH_MD = "MM月dd日";
    private final static String[] WEEKDAYS = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};

    /**
     * 格式化日期 按指定格式
     *
     * @param date    需要格式化的 日期对象
     * @param pattern 日期样式
     */
    public static String formatDate(Date date, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

    /**
     * 把字符串按格式转换成 Date对象
     *
     * @param text
     * @param pattern 日期样式
     * @return
     */
    public static Date parse(String text, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        try {
            return format.parse(text);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取当前时间 年 月 日 (月份要+1)
     *
     * @return
     */
    public static String getDate() {
        Calendar cal = Calendar.getInstance();
        StringBuffer stringBuffer = new StringBuffer();
        return stringBuffer.append(cal.get(Calendar.YEAR))
                .append("年")
                .append(cal.get(Calendar.MONTH) + 1)
                .append("月")
                .append(cal.get(Calendar.DAY_OF_MONTH))
                .append("日")
                .append(cal.get(Calendar.HOUR_OF_DAY))
                .append(":")
                .append(cal.get(Calendar.MINUTE))
                .append(":")
                .append(cal.get(Calendar.SECOND))
                .toString();
    }

    /**
     * 获取当天星期几
     *
     * @return
     */
    public static String getDayOfWeek() {
        Calendar cal = Calendar.getInstance();
        return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
    }

    /**
     * 获取几天之后或者几天之前星期几
     *
     * @param days 天数
     * @return
     */
    public static String getDateAfterDays(int days) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_WEEK, days);
        return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
    }
    
     /**
     * 获取某年某月的日期最大值
     *
     * @param year  年份
     * @param month 月份
     * @return 最大值
     */
    public static int getLastDay(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();  //清除所有日期数据
        if (year != 0) {
            calendar.set(Calendar.YEAR, year);
        }
        calendar.set(Calendar.MONTH, month - 1);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    
    /**
     * 根据年月获取当月最后一天
     * @param yearmonth yyyy-MM
     * @return yyyy-MM-dd
     * @throws ParseException
     */
    public static String getLastDayOfMonth(String yearmonth) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
            Date dd = format.parse(yearmonth);
            Calendar cal = Calendar.getInstance();
            cal.setTime(dd);
            int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
            String result = yearmonth+"-"+cc;
            return result;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    // 未完待加入......
}
上一篇下一篇

猜你喜欢

热点阅读