Java中JDK8之前关于时间的API


  

引言:

java在JDK8之前就提供了一些较为常用的关于时间的API。

一、java.lang.System 类

  System类提供的 public static long currentTimeMillis() 用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。
  计算世界时间的主要标准有:

UTC(Coordinated Universal Time)
GMT(Greenwich Mean Time)
CST(Central Standard Time)

二、java.util.Date 类

  表示特定的瞬间,精确到毫秒

  1. 构造器:
    • Date():使用无参构造器创建的对象可以获取本地当前时间。即,创建一个对应当前时间的Date对象
    • Date(long date):创建指定毫秒数的Date对象
  2. 常用方法
    • getTime():获取当前Date对象对应的毫秒数。(时间戳)
    • toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。即,显示当前的年、月、日、时、分、秒
    • 其它很多方法都过时了。
  3. java.sql.Date对应着数据库中的日期类型的变量。且java.sql.Date是java.util.Date的子类。
import org.junit.Test;
import java.util.Date;

public class DateTimeTest {

    /*Date类测试*/
    @Test
    public void test2() {
        //构造器一:Date()创建一个对应当前时间的Date对象
        Date date1 = new Date();
        System.out.println(date1);//Fri Jan 08 15:52:29 CST 2021

        System.out.println(date1.getTime());//获取当前Date对象对应的毫秒数。(时间戳)

        //构造器二:创建指定毫秒数的Date对象
        Date date2 = new Date(155030620410L);
        System.out.println(date2.toString());//Sat Nov 30 16:03:40 CST 1974

        //创建java.sql.Date对象
        java.sql.Date date3 = new java.sql.Date(35235325345L);
        System.out.println(date3);//1971-02-13

        //java.util.Date对象 与 java.sql.Date对象 的互转
        Date date4 = new Date();
        java.sql.Date date5 = new java.sql.Date(date4.getTime());

        Date date6 = new java.sql.Date(73193271938712L);//多态
    }

    /*System.currentTimeMillis()测试*/
    @Test
    public void test1() {
        long time = System.currentTimeMillis();
        //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。常常称其为 时间戳
        System.out.println(time);
    }
}

三、java.text.SimpleDateFormat 类

  Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。SimpleDateFormat是对日期Date类的格式化和解析

  1. 它允许进行格式化:日期–>字符串、解析:字符串–>日期
  2. 格式化:
    • SimpleDateFormat() :默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:public String format(Date date):方法格式化时间对象date
  3. 解析:
    • public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
public class DateTimeTest {

    @Test
    public void testSimpleDateFormat() throws ParseException {
        //实例化SimpleDateFomat:使用默认构造器
        SimpleDateFormat sdf = new SimpleDateFormat();
        //格式化:日期 --> 字符串
        Date date = new Date();
        System.out.println(date);
        String format = sdf.format(date);
        System.out.println(format);

        //解析:字符串 --> 日期
        String str = "2021-1-8 下午19:16";//要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
        Date date1 = sdf.parse(str);
        System.out.println(date1);

        //*************按照指定的方式格式化和解析:调用带参的构造器*****************
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);
        //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
        Date date2 = sdf1.parse(format1);
        System.out.println(date2);
    }


    /**
     * 练习一:字符串"2020-09-08"转换为java.sql.Date
     */
    @Test
    public void testExer() throws ParseException {
        String birth = "2020-09-08";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(birth);
        java.sql.Date birthDate = new java.sql.Date(date.getTime());
        System.out.println(birthDate);
    }

    /**
     * 练习二:"三天打渔两天晒网"   1990-01-01  xxxx-xx-xx 打渔?晒网?
     * 举例:2020-09-08 ? 总天数
     * 总天数 % 5 == 1,2,3 : 打渔
     * 总天数 % 5 == 4,0 : 晒网
     * 总天数的计算?
     * 方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
     * 方式二:1990-01-01  --> 2019-12-31  +  2020-01-01 -->2020-09-08
     */
    @Test
    public void testExer1() throws ParseException {
        String startDay = "1990-01-01";
        String endDay = "2020-01-08";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = sdf.parse(startDay);
        Date date2 = sdf.parse(endDay);

        long day = (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000) + 1;
        String result = (day % 5 < 3) ? "打渔" : "嗮网";
        System.out.println(result);
    }
}

四、java.util.Calendar(日历)类

  Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

  1. 获取Calendar实例的方法
    • 使用Calendar.getInstance()方法
    • 调用它的子类GregorianCalendar的构造器。
  2. 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND
    • public void set(int field,int value)
    • public void add(int field,int amount)
    • public final Date getTime()
    • public final void setTime(Date date)
  3. 注意:
    • 获取月份时:一月是0,二月是1,以此类推,12月是11
    • 获取星期时:周日是1,周二是2 , 。。。。周六是7
public class DateTimeTest {

    @Test
    public void testCalendar() {
        //1. 实例化
        //方式一:创建其子类 GregorianCalendar 的对象
        //方式二:调用其静态方法getInstance()
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());//class java.util.GregorianCalendar

        //2. 常用方法
        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

        //set()
        //calendar可变性
        calendar.set(Calendar.DAY_OF_MONTH, 22);//返回值为void,改变本身的值
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);//可为负数
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //getTime():日历类---> Date
        Date date = calendar.getTime();
        System.out.println(date);

        //setTime():Date ---> 日历类
        Date date1 = new Date();
        calendar.setTime(date1);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
    }
}

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
Java中JDK8新日期时间API Java中JDK8新日期时间API
   引言: java的JDK8中新增了许多更加实用的时间API,之前的一些时间API逐渐被弃用。   JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而
2021-01-08
下一篇 
Java中的StringBuffer和StringBuilder介绍 Java中的StringBuffer和StringBuilder介绍
   引言: Java中除了String类与字符串相关外,还有StringBuffer和StringBiulder也都要与字符串操作有关。String是不可变字符序列,StringBuffer是可变字符序列。 一、StringBuffer
2021-01-07
  目录