日期相关类

作者: luoqiang108 | 来源:发表于2018-02-28 10:51 被阅读0次

    Date类

    java中用于描述日期的类。Date内部维护着一个long值,这个值表示的是1970-01-01 00:00:00到Date所表示的日期之间的毫秒值。

    import java.util.Date;
    /**
     * java中日期类Date
     */
    public class DateTest {
        public static void main(String[] args){
            //创建一个Date实例,,默认的构造方法创建的日期代表当前系统时间
            Date date = new Date();
            /**
             * 输出date对象
             * Tue Feb 27 08:27:54 GMT 2018(jdk1.5)
             * GMT:格林威治时间,世界上计时流行的标志
             * 中国所属的时区为+8区,所有要对时间上的小时+8
             * Tue Feb 27 16:27:54 CST 2018(jdk1.6及以后)
             * CST:中部标准时间,同时代表了下面4个时区:
             * CST Central Standard Time (USA) UT-6:00
             * CST Central Standard Time (Australia) UT 9:30
             * CST China Standard Time UT 8:00
             * CST Cuba Standard Time UT-4:00
             */
            System.out.println(date);//Thu Mar 14 13:56:34 CST 2019
            //查看date内部的毫秒值
            long time = date.getTime();
            System.out.println(time);//1552542994191
            System.out.println(System.currentTimeMillis());//1552542994191
            //设置一个一天后的当前时间,让Date表示该日期
            date.setTime(time+1000*60*60*24);
            System.out.println(date);
            /**
             * 获取当前年份
             * 不推荐使用,会有千年虫问题
             * 对于日期的计算,推荐使用Calendar类
             */
            int year=date.getYear();
        }
    }
    

    Calendar类

    日历类,Calendar不存在千年虫问题。并且可以非常方便的计算日期。

    import java.util.Calendar;
    import java.util.Date;
    /**
     * 日历类
     */
    public class CalendarTest {
        public static void main(String[] args){
            /**
             * 通过Calendar的静态方法获取一个实例
             * 该方法会自行决定时区,帮我们创建Calendar实例
             * 该方法会根据当前系统所在地区来决定时区
             * 这里要注意,实际上根据不同的时区,Calendar有若干个
             * 子类实现。而Calendar本身是抽象类,不能实例化!
             * 我们不需要关心创建的实例具体为哪个子类,我们只需要根据
             * Calendar规定的方法来使用就可以了。
             */
            //构造出来表示当前时间的日历类
            Calendar calendar = Calendar.getInstance();
            /**
             * 日历类所解决的根本问题是简化日期的计算
             * 要想表示某个日期还应使用Date描述
             * Calendar是可以将其描述的时间转化为Date的
             * 我们只需要调用其getTime()方法就可以获取描述的日期的
             * Date对象了
             */
            Date now = calendar.getTime();//获取日历所描述的日期
            System.out.println(now);
            //通过日历类计算时间
            /**
             * 为日历类设置时间
             * 日历类设置时间使用通用方法set
             * set(int field,int value)
             * fiele为时间分量:Calendar提供了相应的常量值
             * value:对应的值
             */
            //设置日历表示2012年
            calendar.set(Calendar.YEAR,2012);
            /*
            * 设置日历表示11月,月份的值是从0开始的,
            * 所以0代表1月以此类推,也可以使用Calendar常量
            */
            calendar.set(Calendar.MONTH,11-1);//Tue Feb 27 20:37:20 CST 2018
            /**
             * 设置日历表示15号
             * DAY_OF_MONTH 月里边的天---号
             * DAY_OF_WEEK 星期里的天---星期几
             * DAY_OF_YEAR 年里的天
             */
            calendar.set(Calendar.DAY_OF_MONTH,15);
            System.out.println(calendar.getTime());//Thu Nov 15 20:37:20 CST 2012
            /**
             * 想得知22天以后是哪天
             */
            calendar.add(Calendar.DAY_OF_YEAR,22);
            System.out.println(calendar.getTime());//Fri Dec 07 20:37:20 CST 2012
            /**
             * 想得知5天前是哪天
             */
            calendar.add(Calendar.DAY_OF_YEAR,-5);
            System.out.println(calendar.getTime());//Sun Dec 02 20:37:20 CST 2012
            /**
             * 想得知一个月后是哪天?
             */
            calendar.add(Calendar.MONTH,1);
            System.out.println(calendar.getTime());//Wed Jan 02 20:37:20 CST 2013
            /**
             * 想获取当前日历表示的日期中的某个时间单位
             * 可以使用get方法
             */
            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH);
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            //month要处理,+1要加上括号,否则变成字符串拼接了
            System.out.println(year+"年"+(month+1)+"月"+day+"日");
        }
    }
    

    SimpleDateFormat类

    • 该类的作用是可以很方便的在字符串和日期类之间相互装行。
    • 我们可以将一个描述日期的字符串:2012-01-01转换为一个Date对象。
    • 同样,我们可以将一个描述日期的Date对象转换为2012-01-01这样格式的字符串来表示

    常用格式字符串

    字符 含义 实例
    y yyyy年——2013年;yy——13年
    M MM月——01月;M月——1月
    d dd日——06日;d日——6日
    E 星期 E——星期日(Sun)
    a AM或PM标识 a——下午(PM)
    H 小时(24小时制) 见下面实例
    h 小时(12小时制) a h时——下午12时
    m 分钟 HH:mm:ss——12:46:33
    s hh(a):mm:ss——12(下午):45:46
    w 年中的周数 27
    W 月份中的周数 2
    D 年中的天数 189
    F 月份中的星期 2
    k 一天中的小时数(1-24) 24
    K am/pm 中的小时数(0-11) 0
    S 毫秒数 978
    z 时区[General time zone] Pacific Standard Time; PST; GMT-08:00
    Z 时区[RFC 822 time zone] -0800
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    /**
     * 日期转换类SimpleDateFormat
     * 这里我们字符串与日期类间相互转换是需要一些约束的
     * “2018-02-28”这个字符串如何转换为Date对象?
     * SimpleDateFormat用来描述日期的格式
     * yyyy-MM-dd   2018-02-28
     * yy-MM-dd   18-02-28
     * yyyy-MM-dd hh:mm:ss   2018-02-28 09:20:53
     * yyyy年MM月dd日 hh时mm分ss秒   2018年02月28日 09时20分53秒
     */
    public class SimpleDateFormatTest {
        public static void main(String[] args) throws ParseException {
            /**
             * 创建一个SimpleDateFormat并告知它要读取的字符串的格式
             */
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            //创建一个日期格式的字符串
            String dateFormat = "2018-02-28";
            Date date = sdf.parse(dateFormat);//这里有个格式不匹配异常需要抛出或捕获
            System.out.println(date);//Wed Feb 28 00:00:00 CST 2018
            /*
            * 反向操作,我们也可以将一个Date对象转换为它所描述的日期
            * 的字符串。同样,转换出来的字符串格式是
            * SimpleDateFormat创建的时候设置的格式
            */
            Date now = new Date();//创建用于描述当前系统时间的Date
            String nowStr = sdf.format(now);
            System.out.println(nowStr);//2018-02-28
            sdf=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
            nowStr = sdf.format(now);
            System.out.println(nowStr);//2018年02月28日 10时47分11秒
            sdf=new SimpleDateFormat("yyyy/MM/dd a hh/mm/ss E");
            nowStr = sdf.format(now);
            System.out.println(nowStr);//2018/02/28 上午 10/47/11 星期三
             /**
             * 扩展
             */
            SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
            sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ss");//非pattern字符“T”要用‘’引入进来
            try {
                Date date = sdf.parse("2018-11-19T09:21:43:58+00"); //解析的字符串只要前面符合解析匹配规则,后面不匹配也可以解析
                System.out.println(date);//Mon Nov 19 09:21:43 CST 2018
                sdf.applyPattern("yyyy.MM.dd G 'at' HH:mm:ss '' z");//非pattern字符“'”只需'引入
                //时区
                date = sdf.parse("2001.07.04 AD at 12:08:56 ' PDT");
                System.out.println(date);//Thu Jul 05 03:08:56 CST 2001
                sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
                date = sdf.parse("2001-07-04T12:08:56.235-0700");
                System.out.println(date);//Thu Jul 05 03:08:56 CST 2001
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            Locale aDefault = Locale.getDefault();//当前系统所在地区
            System.out.println(aDefault.getCountry());//CN
            System.out.println(aDefault.getDisplayCountry());//中国
            System.out.println(aDefault.getLanguage());//zh
            System.out.println(aDefault.getDisplayLanguage());//中文
            System.out.println(aDefault.getDisplayName());//中文 (中国)
            TimeZone timeZone = TimeZone.getDefault();//当前系统所在时区
            System.out.println(timeZone.getDisplayName());//中国标准时间
            System.out.println(timeZone.getID());//Asia/Shanghai
            TimeZone mTimeZone = TimeZone.getTimeZone("America/Phoenix");
            System.out.println(mTimeZone.getDisplayName());//Mountain 标准时间
            mTimeZone = TimeZone.getTimeZone("Asia/Shanghai");
            System.out.println(mTimeZone.getDisplayName());//中国标准时间
            mTimeZone = TimeZone.getTimeZone("GMT+8:00");//东八区时区、GMT-8:00(西八区)
            System.out.println(mTimeZone.getDisplayName());//GMT+08:00
    
        }
    }
    

    工具类

    public class DateUtil {
        /**
         * 按指定格式输出当前时间
         *
         * @param pattern
         * @return
         */
        public static String getCurrentFormatDate(String pattern) {
            Date date = new Date();
            SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
            sdf.applyPattern(pattern);
            return sdf.format(date);
        }
    
        /**
         * 按指定格式输出时间戳时间
         *
         * @param timestamp
         * @param pattern
         * @return
         */
        public static String getTimeMillisFormatDate(long timestamp, String pattern) {
            Date date = new Date(timestamp);
            SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getInstance();
            sdf.applyPattern(pattern);
            return sdf.format(date);
        }
    
        /**
         * 时区转换
         * @param date 要转换的时间
         * @param oldPattern 待转换时间的格式
         * @param oldLocale 待转换时间所在地区
         * @param newPattern 转换后时间格式
         * @param newTimeZone 需转换的地方时区
         * @return
         * @throws ParseException
         */
        public static String zoneTimeTransform(String date, String oldPattern, Locale oldLocale, String newPattern, TimeZone newTimeZone) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat(oldPattern, oldLocale);
            Date oldDate = sdf.parse(date);
            sdf.applyPattern(newPattern);
            sdf.setTimeZone(newTimeZone);
            return sdf.format(oldDate);
        }
        
    }
    

    相关文章

      网友评论

        本文标题:日期相关类

        本文链接:https://www.haomeiwen.com/subject/owdmxftx.html