• java基础知识(六)日期处理


    一、日期处理类

      在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃

    1、Date

    package com;
    
    
    import java.util.Date;
    
    /**
     * Created by Administrator on 2016/11/8.
     */
    public class Test {
    
        public static void main(String arg[]){
                    /**
             * Date 有两个构造方法
             * 1、用来获取当前系统时间
             * 2、分配 Date 对象并初始化此对象,以表示自从标准基准时间
             * (称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数
             */
            Date date = new Date();
            System.out.println(date);
            Date date1 = new Date(123l);
            Date date2 = new Date(123l);
            System.out.println(date1);
    
            /**
             * Date的方法,下面列出的是未过时的,获取年、月、日及格式化方法已废弃,将由Calendar类实现,以便于国际化
             */
            System.out.println("测试此日期是否在指定日期之后 : " + date.after(date1));
            System.out.println("测试此日期是否在指定日期之前 : " + date.before(date1));
            System.out.println("返回对象的副本 : " + date.clone());
            System.out.println("比较两个日期的顺序 : " + date.compareTo(date1));
            System.out.println("比较两个日期的相等性 : " + date1.equals(date2));//比较的是值
            System.out.println("返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 : " + date.getTime());
            System.out.println("返回此对象的哈希码值 : " + date.hashCode());
            date.setTime(12345l);//设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点
            System.out.println("setTime设置后的date为 : " + date);
            System.out.println("把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) : " + date.toString());
        }
    
    }

      java有3中比较日期的方法

    • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
    • 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
    • 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

    2、SimpleDateFormat

      SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

    public class Test {
        public static void main(String arg[]) {
            /**
             *SimpleDateFormat构造方法,有4个,下面介绍常用的两个
             * 1.用默认的模式和默认语言环境的日期格式符号构造
             * 2 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
             */
            Date date01 = new Date();
            SimpleDateFormat sdf01 = new SimpleDateFormat();
            System.out.println(sdf01.format(date01));
            SimpleDateFormat sdf02 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
            System.out.println(sdf02.format(date01) + "
    ");
    
            /**
             * SimpleDateFormat方法
             */
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
            String str = sdf.format(date);
            System.out.println(str);
            try {
                sdf.applyLocalizedPattern("E");
                System.out.println("将给定的本地化模式字符串应用于此日期格式 : " + sdf.format(date));
            }catch (Exception e) {
                System.out.println("input format error, error information : " + e);
            }
            sdf.applyPattern("yyyy-MM-dd");
            System.out.println("将给定模式字符串应用于此日期格式 : " + sdf.format(date));
            SimpleDateFormat sdf1 = (SimpleDateFormat) sdf.clone();
            System.out.println("创建此 SimpleDateFormat 的一个副本 : " + sdf.clone());
            System.out.println("比较给定对象与此 SimpleDateFormat 的相等性 : " + sdf.equals(sdf1));
            StringBuffer sb = new StringBuffer("当前时间是[");
            System.out.println("将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer : " + sdf.format(date, sb, new FieldPosition(1)) + "]");
            System.out.println("格式化生成 AttributedCharacterIterator 的对象 : " + sdf.formatToCharacterIterator(date).getAllAttributeKeys());
            System.out.println("返回在 100 年周期内被解释的两位数字年份的开始日期 : " + sdf.get2DigitYearStart());
            System.out.println("解析字符串的文本,生成 Date : " + sdf.parse(str, new ParsePosition(1)));
            System.out.println("返回描述此日期格式的本地化模式字符串 : " + sdf.toLocalizedPattern());
            System.out.println("返回描述此日期格式的模式字符串 : " + sdf.toPattern());
        }
    
    }

    时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

    字母描述示例
    G 纪元标记 AD
    y 四位年份 2001
    M 月份 July or 07
    d 一个月的日期 10
    h  A.M./P.M. (1~12)格式小时 12
    H 一天中的小时 (0~23) 22
    m 分钟数 30
    s 秒数 55
    S 毫秒数 234
    E 星期几 Tuesday
    D 一年中的日子 360
    F 一个月中第几周的周几 2 (second Wed. in July)
    w 一年中第几周 40
    W 一个月中第几周 1
    a A.M./P.M. 标记 PM
    k 一天中的小时(1~24) 24
    K  A.M./P.M. (0~11)格式小时 10
    z 时区 Eastern Standard Time
    ' 文字定界符 Delimiter
    " 单引号 `

            Date date01 = new Date();
            SimpleDateFormat sdf01 = new SimpleDateFormat();
            sdf01.applyLocalizedPattern("E");
            System.out.println("星期几 : " + sdf01.format(date01));
            sdf01.applyLocalizedPattern("D");
            System.out.println("一年中的日子 : " + sdf01.format(date01));

    3、Calendar

      Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

    public class Test1 {
        public static void main(String arg[]) {
            /**
             * Calendar字段
             */
            Calendar c1 = Calendar.getInstance();
            System.out.println(c1.getTime() + "
    ");
    
            System.out.println("指示年的 get 和 set 的字段数字 : " + c1.get(Calendar.YEAR));
            System.out.println("指示月份的 get 和 set 的字段数字 : " + c1.get(Calendar.MONTH));
            System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DATE));
            System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
            System.out.println("get 和 set 的字段数字,指示一小时中的分钟 : " + c1.get(Calendar.MINUTE));
            System.out.println("get 和 set 的字段数字,指示一分钟中的秒 : " + c1.get(Calendar.SECOND) + "
    ");
    
            System.out.println("get 和 set 的字段数字,指示当前年中的星期数 : " + c1.get(Calendar.WEEK_OF_YEAR));
            System.out.println("get 和 set 的字段数字,指示当前月中的星期数 : " + c1.get(Calendar.WEEK_OF_MONTH) + "
    ");
    
            System.out.println("get 和 set 的字段数字,指示当前年中的天数 : " + c1.get(Calendar.DAY_OF_YEAR));
            System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DAY_OF_MONTH));
            System.out.println("get 和 set 的字段数字,指示一个星期中的某天 : " + c1.get(Calendar.DAY_OF_WEEK) + "
    ");
    
            System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
            System.out.println("get 和 set 的字段数字,指示一天中的小时 : " + c1.get(Calendar.HOUR_OF_DAY) + "
    ");
    
    
            /**
             * Calendar方法
             */
            c1.add(Calendar.YEAR, 1);
            System.out.println("根据日历的规则,为给定的日历字段添加或减去指定的时间量 : " + c1.getTime());
            Calendar c2 = Calendar.getInstance();
            System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果 : " + c1.after(c2));
            System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果 : " + c1.before(c2));
            //c2.clear();
            //System.out.println("将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
            //c2.clear(Calendar.YEAR);
            //System.out.println("将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
            System.out.println("比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量) : " + c1.compareTo(c2));
            System.out.println("返回给定日历字段的值 : " + c2.get(Calendar.YEAR));
            System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值 : " + c2.getActualMaximum(Calendar.YEAR));
            System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值 : " + c2.getActualMinimum(Calendar.YEAR));
            System.out.println("获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY : " + c2.getFirstDayOfWeek());
    
            System.out.println("返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象 : " + c2.getTime());
            System.out.println("返回此 Calendar 的时间值,以毫秒为单位 : " + c2.getTimeInMillis());
            System.out.println("获得时区 : " + c2.getTimeZone().getDisplayName());
            c2.roll(Calendar.DATE, 1);
            System.out.println("向指定日历字段添加指定(有符号的)时间量,不更改更大的字段 : " + c2.getTime());
            c2.set(Calendar.YEAR, 2002);
            System.out.println("将给定的日历字段设置为给定值 : " + c2.getTime());
            c2.set(1997, 7, 1, 0, 0);
            System.out.println(" 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 : " + c2.getTime());
            c2.set(1997, 7, 1, 0, 0, 0);
            System.out.println("设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 : " + c2.getTime());
            c2.setTime(new Date());
            System.out.println("使用给定的 Date 设置此 Calendar 的时间 : " + c2.getTime());
        }
    
    }

     二、常用的日期处理方法

    public class DateUtil {
    
        public final static String FORMAT_19 = "yyyy-MM-dd hh:mm:ss";
        public final static String FORMAT_10 = "yyyy-MM-dd";
        public final static String FORMAT_CN_19 = "yyyy年MM月dd日 hh时mm分ss秒";
        public final static String FORMAT_CN_10 = "yyyy年MM月dd日";
    
        /**
         * 日期转为指定格式
         */
        public static String parsDateToString(Date date, String format) {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.format(date);
        }
    
        /**
         * 字符串转换为日期
         */
        public static Date parsStringToDate(String formatDate, String format) {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            Date date = null;
            try {
                date = sdf.parse(formatDate);
            } catch (ParseException e) {
                System.out.println("输入日期格式不正确,异常信息:" + e);
            }
            return date;
        }
    
        /**
         * 获得指定日期的前num个月的日期
         */
        public static Date beforeMonth(Date date, int num) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(calendar.MONTH, num * -1);
            Date dBefore = calendar.getTime();
            return dBefore;
        }
    
        private static Calendar dateToCalendar(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar;
        }
    
        /**
         * 日期为所在月的第几周
         */
        public static int weekOfMonth(Date date) {
            return dateToCalendar(date).get(Calendar.WEEK_OF_MONTH);
        }
    
        /**
         * 日期为所在年的第几周
         */
        public static int weekOfYear(Date date) {
            return dateToCalendar(date).get(Calendar.WEEK_OF_YEAR);
        }
    
        /**
         * 日期为所在年的第几天
         */
        public static int dayOfYear(Date date) {
            return dateToCalendar(date).get(Calendar.DAY_OF_YEAR);
        }
    
        /**
         * 根据一个时间获取该时间为星期几
         */
        public static String dayOfWeek(Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat("E");
            return sdf.format(date);
        }
    
        /**
         * 计算两个时间之间的天数
         */
        public static int countDaysBetween(Date d1, Date d2) {
            Calendar c1 = dateToCalendar(d1);
            Calendar c2 = dateToCalendar(d2);
            return Math.abs(Math.abs(c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 365 + (c1.get(Calendar.DAY_OF_YEAR) - c2.get(Calendar.DAY_OF_YEAR)));
        }
    
        public static void main(String[] args) {
            String formatDate = DateUtil.parsDateToString(new Date(), DateUtil.FORMAT_CN_19);
            System.out.println("日期转为指定格式 : " + formatDate);
            System.out.println("字符串转换为日期 : " + parsStringToDate(formatDate, DateUtil.FORMAT_CN_19));
            System.out.println("获得指定日期的前num个月的日期 : " + beforeMonth(new Date(), 3));
            System.out.println("日期为所在月的第几周 : " + weekOfMonth(new Date()));
            System.out.println("日期为所在年的第几周 : " + weekOfYear(new Date()));
            System.out.println("日期为所在年的第几天 : " + dayOfYear(new Date()));
            System.out.println("日期是星期几 : " + dayOfWeek(new Date()));
            Calendar c = Calendar.getInstance();
            c.set(2017, 10, 25);
            System.out.println("计算两个时间之间的天数 : " + countDaysBetween(new Date(), c.getTime()));
    
        }
    }
  • 相关阅读:
    mybatis ForEach Collection集合等规范解析(转)
    IntelliJ IDEA怎么安装
    django数据库基本操作-增删改查(tip)-基本
    解决Django中在.js文件中用ajax请求后端,找不到CSRF问题
    jQuery判断当前元素是第几个元素&获取第N个元素
    python 判断字符串是否为空用什么方法?
    jq 跳转方式汇总
    SwitchOmega的详细配置——for Windows
    ubuntu怎用使用命令搜索软件源中的软件
    ubuntu16.04中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/sunjf/p/java_date_introduction.html
Copyright © 2020-2023  润新知