zoukankan      html  css  js  c++  java
  • JAVA中的六种日期类型使用

    基本的6种日期类

    /**
             * 六种时间类型的类
             * 数据库格式的时间三种格式
             */
            java.util.Date date = new java.util.Date();//年与日时分秒
            //数据库的三种类都继承了java.util.Date,在除了数据库的情况下使用
            java.sql.Date sDate = new java.sql.Date(date.getTime());//年月日  
            java.sql.Time  sTime = new java.sql.Time(sDate.getTime());//时分秒
            java.sql.Timestamp sTimeStamp = new java.sql.Timestamp(sTime.getTime());//年月日时分秒毫秒
    
            //时间格式转换
            java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
            //日历类是一个抽象基类
            java.util.Calendar calender = Calendar.getInstance();//
    
            System.out.println(date);
            System.out.println(sDate);
            System.out.println(sTime);
            System.out.println(sTimeStamp);
            System.out.println(calender);

    输出的日期格式:

    Thu Mar 28 14:47:18 CST 2019
    2019-03-28
    14:47:18
    2019-03-28 14:47:18.162
    java.util.GregorianCalendar[time=1553755638277,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“Asia/Shanghai”,offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=5,DAY_OF_MONTH=28,DAY_OF_YEAR=87,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=47,SECOND=18,MILLISECOND=277,ZONE_OFFSET=28800000,DST_OFFSET=0]

    由此可以看出几种类的时间格式有差异

    类名称 时间格式
    java.util.Date 年月日时分秒
    java.sql.Date 年月日
    java.sql.Time 时分秒
    java.sql.Timestamp 年月日时分秒毫秒
    java.util.Calendar 年月日时分秒毫秒
    查询源码可知除过Calendar 类外其他的类都是继承java.util.Date类并且屏蔽了相关时间精度,重写了toString()方法。
    但是都属于同一父类的继承可以进行相互转换,getTime()方法获取当前时间的秒数还是没有进行重写,获得时间秒数都是一样 (Timestamp除外,Timestamp重写了getTime添加了毫秒数)
    对于基础以上的java.util.Date的继承类来说,都会存在一个问题,那就是对于许多方法都已经废弃掉,java提供了Calendar 和 SimpleDateFormat 来支持时间日期的更方便操作。

    Calendar
    Java.util.Calendar区别与java.util.Date的几个地方也需要注意一下 :

    首先,Calendar增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而java.util.Date只是精确到秒。
    其次,Calendar过去年的时候是当前年份比如:2010,而Date获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用getYear后过去的值就是110)。
    Calendar是一个抽象类,之所以能够实例化,是因为此处的Calendar充当了一个类似于工厂的作用,在getInstance方法中实例化了Calendar子类GregorianCalendar,并把它返回给用户使用。
    两个类是可以进行相互转换的可以使用Calendar类的setTime(Date date)方法可以转换,获取Date队形可以getTime()方法可以转换成Date对象

    /** Calendar.class**/
    /**
         * Returns a <code>Date</code> object representing this
         * <code>Calendar</code>'s time value (millisecond offset from the <a
         * href="#Epoch">Epoch</a>").
         *
         * @return a <code>Date</code> representing the time value.
         * @see #setTime(Date)
         * @see #getTimeInMillis()
         */
        public final Date getTime() {
            return new Date(getTimeInMillis());
        }
    
        /**
         * Sets this Calendar's time with the given <code>Date</code>.
         * <p>
         * Note: Calling <code>setTime()</code> with
         * <code>Date(Long.MAX_VALUE)</code> or <code>Date(Long.MIN_VALUE)</code>
         * may yield incorrect field values from <code>get()</code>.
         *
         * @param date the given Date.
         * @see #getTime()
         * @see #setTimeInMillis(long)
         */
        public final void setTime(Date date) {
            setTimeInMillis(date.getTime());
        }

    Calendar和Date可以及逆行转换,也就打通了过时时间类的使用具体的方法还需要多加练习

    SimpleDateFormat 日期格式转换

    主要使用的是SimpleDateFormat 类的日期格式转换和日期字符串解析成日期对象
    *接上述代码

    //时间格式转换
            java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            System.out.println("格式转换后:");
            //类型转换参数是Date类型,返回值只是 一个字符串
            System.out.println(dateFormat.format(date));
            System.out.println(dateFormat.format(sDate));
            System.out.println(dateFormat.format(sTime));
            System.out.println(dateFormat.format(sTimeStamp));
            System.out.println(dateFormat.format(calender.getTime()));

    格式转换后:
    2019-03-28 02:47:18
    2019-03-28 02:47:18
    2019-03-28 02:47:18
    2019-03-28 02:47:18
    2019-03-28 02:47:18

    //时间格式的解析    
            //日期字符转换成日期对象
            //首先进行字符串模式的规定
            java.text.SimpleDateFormat dateFormat1 = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            //进行字符串的解析,都会解析成Date基类(会产生解析异常)
            java.util.Date date1 = dateFormat1.parse("2020-12-12 12:20:01");
            System.out.println(date1);    

    Sat Dec 12 00:20:01 CST 2020

    时间格式的解析,如果时间格式不符合会出现ParseException异常

    /**
         * Parses text from the beginning of the given string to produce a date.
         * The method may not use the entire text of the given string.
         * <p>
         * See the {@link #parse(String, ParsePosition)} method for more information
         * on date parsing.
         *
         * @param source A <code>String</code> whose beginning should be parsed.
         * @return A <code>Date</code> parsed from the string.
         * @exception ParseException if the beginning of the specified string
         *            cannot be parsed.
         */
        public Date parse(String source) throws ParseException
        {
            ParsePosition pos = new ParsePosition(0);
            Date result = parse(source, pos);
            if (pos.index == 0)
                throw new ParseException("Unparseable date: "" + source + """ ,
                    pos.errorIndex);
            return result;
        }

    这些时间格式我们应该如何使用
    对于现在的日期格式,只要我们几乎都是可以像话转换和借助格式化类行进操作的,具体的到底使用什么类型还是需要看业务需要

    ==针对不同的数据库选用不同的日期类型 ==
      Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型
      MS Sqlserver数据库的DateTime类型,需要年月日时分秒,选择java.sql.Timestamp类型

    oracle数据库提供的todate()和tochar()函数也可以进行日期格式的转换,所以我们使用的时候最好对日期格式进行格式进行统一转换
    可以参考博客(对于不同数据库的日期格式的使用)

    Java多线程编程中使用DateFormat类

    全网最权威Java8日期时间类详解

    java 日期相关类的学习和多线程下的日期格式化使用

    Java常用类:关于日期、时间的常用类

  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/edda/p/14588206.html
Copyright © 2011-2022 走看看