day18_常用類(時間相關的類丶數字類)

java_pedestrian發表於2020-12-23

System

  • System類提供的public static long currentTimeMillis()用來返回當前時 間與1970年1月1日0時0分0秒之間以毫秒為單位的時間差。
/*
獲取自1970年1月1日 00:00:00 000到當前系統時間的總毫秒數。
1秒 = 1000毫秒

簡單總結一下System類的相關屬性和方法:
    System.out 【out是System類的靜態變數。】
    System.out.println() 【println()方法不是System類的,是PrintStream類的方法。】
    System.gc() 建議啟動垃圾回收器
    System.currentTimeMillis() 獲取自1970年1月1日到系統當前時間的總毫秒數。
    System.exit(0) 退出JVM。
 */
public class DateTest02 {
    public static void main(String[] args) {
        // 獲取自1970年1月1日 00:00:00 000到當前系統時間的總毫秒數。
        long nowTimeMillis = System.currentTimeMillis();
        System.out.println(nowTimeMillis); //1583377912981

        // 統計一個方法耗時
        // 在呼叫目標方法之前記錄一個毫秒數
        long begin = System.currentTimeMillis();
        print();
        // 在執行完目標方法之後記錄一個毫秒數
        long end = System.currentTimeMillis();
        System.out.println("耗費時長"+(end - begin)+"毫秒");
    }

    // 需求:統計一個方法執行所耗費的時長
    public static void print(){
        for(int i = 0; i < 1000000000; i++){
            System.out.println("i = " + i);
        }
    }
}

java.util.Date類

java.util.Date 類 表示特定的瞬間,精確到毫秒。其常用的子類有java.sql.Date類。繼續查閱Date類的描述,發現Date擁有多個建構函式,只是部分已經過時,但是其中有未過時的建構函式可以把毫秒值轉成日期物件。

  • public Date() :分配Date物件並初始化此物件,以表示分配它的時間(精確到毫秒)。
  • public Date(long date) :分配Date物件並初始化此物件,以表示自從標準基準時間(稱為“曆元(epoch)”,即1970年1月1日00:00:00 GMT)以來的指定毫秒數。 由於我們處於東八區,所以我們的基準時間為1970年1月1日8時0分0秒。

簡單來說:使用無參構造,可以自動獲取當前系統時間的毫秒時刻;指定long型別的構造引數,可以自定義毫秒時刻。例如

package DateTest;

import java.util.Date;

public class Demo01Date {
    public static void main(String[] args) {
        // 建立日期物件, 獲取系統當前時間(精確到毫秒的系統當前時間)
        System.out.println(new Date()); //Sat Dec 05 09:47:36 CST 2020
        // 建立日期物件,把當前的毫秒值轉成日期物件
        System.out.println(new Date(0L)); //Thu Jan 01 08:00:00 CST 1970
    }
}

在使用println方法時,會自動呼叫Date類中的toString方法。Date類對Object類中的toString方法進行了覆蓋重寫,所以結果為指定格式的字串。 

常用的方法有:

Date類中的多數方法已經過時,我們需要記住的方法

  • public long getTime() 把日期物件轉換成對應的時間毫秒值。 
 /*
    java.util.Date類
           |---java.sql.Date類

    1.兩個構造器的使用
        >構造器一:Date():建立一個對應當前時間的Date物件
        >構造器二:建立指定毫秒數的Date物件
    2.兩個方法的使用
        >toString():顯示當前的年、月、日、時、分、秒
        >getTime():獲取當前Date物件對應的毫秒數。(時間戳)

    3. java.sql.Date對應著資料庫中的日期型別的變數
        >如何例項化
        >如何將java.util.Date物件轉換為java.sql.Date物件
     */
    @Test
    public void test2(){
        //構造器一:Date():建立一個對應當前時間的Date物件
        Date date1 = new Date();
        System.out.println(date1.toString());//Sat Feb 16 16:35:31 GMT+08:00 2019

        System.out.println(date1.getTime());//1550306204104

        //構造器二:建立指定毫秒數的Date物件
        Date date2 = new Date(155030620410L);
        System.out.println(date2.toString());

        //建立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 java.sql.Date(2343243242323L);
//        java.sql.Date date5 = (java.sql.Date) date4;
        //情況二:
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());


    }

DateFormat類 

java.text.DateFormat 是日期/時間格式化子類的抽象類,我們通過這個類可以幫我們完成日期和文字之間的轉換,也就是可以在Date物件與String物件之間進行來回轉換。

  • 格式化:按照指定的格式,從Date物件轉換為String物件。
  • 解析:按照指定的格式,從String物件轉換為Date物件。

構造方法

由於DateFormat為抽象類,不能直接使用,所以需要常用的子類 java.text.SimpleDateFormat 。這個類需要一個模式(格式)來指定格式化或解析的標準。構造方法為:

  • public SimpleDateFormat(String pattern) :用給定的模式和預設語言環境的日期格式符號構造SimpleDateFormat。

引數pattern是一個字串,代表日期時間的自定義格式。格式規則 如下圖所示

                                                    

建立SimpleDateFormat物件的程式碼如:

package DateTest;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class Demo02SimpleDateFormat {
    public static void main(String[] args) {
        // 對應的日期格式如:2018‐01‐16 15:06:38
        DateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");
        System.out.println(format);//java.text.SimpleDateFormat@e4702c80
    }
}

DateFormat類的常用方法有:

  • public String format(Date date) :將Date物件格式化為字串。
  • public Date parse(String source) :將字串解析為Date物件。 
package DateTest;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo02SimpleDateFormat {
    public static void main(String[] args) throws ParseException {
        Date d1 = new Date();
        // 建立日期格式化物件,在獲取格式化物件時可以指定風格
        // 注意:在日期格式中,除了y M d H m s S這些字元不能隨便寫之外,剩下的符號格式自己隨意組織。
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        // Date ---> String
        String s1 = df.format(d1);
        System.out.println(s1); // 2020年12月05日
        // 注意:字串的日期格式和SimpleDateFormat物件指定的日期格式要一致。不然會出現異常:java.text.ParseException
        String s2 = "2018年12月11日";
        // String --> Date
        Date d2 = df.parse(s2);
        System.out.println(d2); // Tue Dec 11 00:00:00 CST 2018
    }
}

Calendar類 

java.util.Calendar 是日曆類,在Date後出現,替換掉了許多Date的方法。該類將所有可能用到的時間資訊封裝為靜態成員變數,方便獲取。日曆類就是方便獲取各個時間屬性的。 

獲取方式

Calendar為抽象類,由於語言敏感性,Calendar類在建立物件時並非直接建立,而是通過靜態方法建立,返回子類物件,如下:Calendar靜態方法

  • public static Calendar getInstance() :使用預設時區和語言環境獲得一個日曆 
Calendar cal = Calendar.getInstance();

常用方法 

根據Calendar類的API文件,常用方法有:

  • public int get(int field) :返回給定日曆欄位的值。
  • public void set(int field, int value) :將給定的日曆欄位設定為給定值。
  • public abstract void add(int field, int amount) :根據日曆的規則,為給定的日曆欄位新增或減去指定的時間量。
  • public Date getTime() :返回一個表示此Calendar時間值(從曆元到現在的毫秒偏移量)的Date物件。

Calendar類中提供很多成員常量,代表給定的日曆欄位: 

get方法用來獲取指定欄位的值,set方法用來設定指定欄位的值,程式碼使用演示:

package DateTest;

import java.util.Calendar;

public class CalendarUtil {
    public static void main(String[] args) {
        // 建立Calendar物件
        Calendar cal = Calendar.getInstance();
        // 設定年
        int year = cal.get(Calendar.YEAR);
        // 設定月
        int month = cal.get(Calendar.MONTH) + 1;
        // 設定日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");//2020年12月5日
    }
}

add方法可以對指定日曆欄位的值進行加減操作,如果第二個引數為正數則加上偏移量,如果為負數則減去偏移量。程式碼如:

package DateTest;

import java.util.Calendar;

public class CalendarUtil {
    public static void main(String[] args) {
        // 建立Calendar物件
        Calendar cal = Calendar.getInstance();
        // 使用add方法 
        cal.add(Calendar.DAY_OF_MONTH, 2);// 加2天
        cal.add(Calendar.YEAR, -3);// 減3年
        // 設定年
        int year = cal.get(Calendar.YEAR);
        // 設定月
        int month = cal.get(Calendar.MONTH) + 1;
        // 設定日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2017年12月7日
    }
}

Calendar中的getTime方法並不是獲取毫秒時刻,而是拿到對應的Date物件。

package DateTest;

import java.util.Calendar;
import java.util.Date;

public class CalendarUtil {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = cal.getTime();
        System.out.println(date); // Sat Dec 05 10:59:38 CST 2020
    }
}

DecimalFormat類

DecimalFormatNumberFormat十進位制數字格式的具體子類 。它具有多種功能,旨在解析和格式化任何語言環境中的數字,包括支援西方,阿拉伯語和印度語數字。它還支援不同型別的數字,包括整數(123),定點數(123.4),科學記數法(1.23E4),百分比(12%)和貨幣金額(123美元)。而且對於數值的小數部分,預設顯示3位小數,在去掉超出小數點後面3位的部分時,會將數值四捨五入為最接近的數值格式化輸出。

import java.text.DecimalFormat;

/*
關於數字的格式化。
 */
public class DecimalFormatTest01 {
    public static void main(String[] args) {
        // java.text.DecimalFormat專門負責數字格式化的。
        //DecimalFormat df = new DecimalFormat("數字格式");

        /*
        數字格式有哪些?
            # 代表任意數字
            , 代表千分位
            . 代表小數點
            0 代表不夠時補0

            ###,###.##
                表示:加入千分位,保留2個小數。
         */
        DecimalFormat df = new DecimalFormat("###,###.##");
        //String s = df.format(1234.56);
        String s = df.format(1234.561232);
        System.out.println(s); // "1,234.56"

        DecimalFormat df2 = new DecimalFormat("###,###.0000"); //保留4個小數位,不夠補上0
        String s2 = df2.format(1234.56);
        System.out.println(s2); // "1,234.5600"

    }
}

BigDecimal類

  • Java中提供了大數字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用於高精度計算.
  • 其中 BigInteger 類是針對大整數的處理類,而 BigDecimal 類則是針對大小數的處理類.
  • BigDecimal 類的實現用到了 BigInteger類,不同的是 BigDecimal 加入了小數的概念.
  • float和Double只能用來做科學計算或者是工程計算;在商業計算中,對數字精度要求較高,必須使用 BigInteger 類和 BigDecimal 類,它支援任何精度的定點數,可以用它來精確計算貨幣值.
  • BigDecimal類建立的是物件,不能使用傳統的+、-、*、/等算術運算子直接對其進行數學運算,而必須呼叫其對應的方法.方法的引數也必須是BigDecimal型別的物件.
import java.math.BigDecimal;

/*
1、BigDecimal 屬於大資料,精度極高。不屬於基本資料型別,屬於java物件(引用資料型別)
這是SUN提供的一個類。專門用在財務軟體當中。

2、注意:財務軟體中double是不夠的。我們們之前有一個學生去用友面試,經理就問了這樣一個問題:
    你處理過財務資料嗎?用的哪一種型別?
        千萬別說double,說java.math.BigDecimal
 */
public class BigDecimalTest01 {
    public static void main(String[] args) {

        // 這個100不是普通的100,是精度極高的100
        BigDecimal v1 = new BigDecimal(100);
        // 精度極高的200
        BigDecimal v2 = new BigDecimal(200);
        // 求和
        // v1 + v2; // 這樣不行,v1和v2都是引用,不能直接使用+求和。
        BigDecimal v3 = v1.add(v2); // 呼叫方法求和。
        System.out.println(v3); //300

        BigDecimal v4 = v2.divide(v1);
        System.out.println(v4); // 2
    }
}

Random類 

  • 此類的例項用於生成偽隨機數。 

成員方法

  • public int nextInt(int n) :返回一個偽隨機數,範圍在 0 (包括)和 指定值 n (不包括)之間的int 值。 
package com.bjpowernode.javase.random;

import java.util.Arrays;
import java.util.Random;

/*
編寫程式,生成5個不重複的隨機數[0-100]。重複的話重新生成。
最終生成的5個隨機數放到陣列中,要求陣列中這5個隨機數不重複。
 */
public class RandomTest02 {
    public static void main(String[] args) {

        // 建立Random物件
        Random random = new Random();

        // 準備一個長度為5的一維陣列。
        int[] arr = new int[5]; // 預設值都是0
        for(int i = 0; i < arr.length; i++){
            arr[i] = -1;
        }

        // 迴圈,生成隨機數
        int index = 0;
        while(index < arr.length){
            // 生成隨機數
            //int num = random.nextInt(101);
            //int num = random.nextInt(6); // 只能生成[0-5]的隨機數!
            int num = random.nextInt(4); // 只能生成[0-3]的隨機數!永遠都有重複的,永遠都湊不夠5個。
            System.out.println("生成的隨機數:" + num);
            // 判斷arr陣列中有沒有這個num
            // 如果沒有這個num,就放進去。
            if(!contains(arr, num)){
                arr[index++] = num;
            }
        }

        // 遍歷以上的陣列
        for(int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
    }

    /**
     * 單獨編寫一個方法,這個方法專門用來判斷陣列中是否包含某個元素
     * @param arr 陣列
     * @param key 元素
     * @return true表示包含,false表示不包含。
     */
    public static boolean contains(int[] arr, int key){
  
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == key){
                // 條件成立了表示包含,返回true
                return true;
            }
        }
        // 這個就表示不包含!
        return false;
    }

}

 

相關文章