Java 基礎類庫:System、Runtime、Object、Math、日期、時間

與用戶互動

運行Java程序的參數

//Java程序入口:main()方法
public static void main(String[] args){...}
  • public修飾符:Java類由JVM調用,爲了讓JVM能夠自由調用這個main()方法,因此使用public修飾符把這個方法暴露出來java

  • static修飾符:JVM調用這個主方法時,不會先建立該主類的對象,而後經過對象來調用該主方法。JVM直接經過該類來調用主方法,所以使用static修飾該主方法。程序員

  • void返回值:由於主方法被JVM調用,該方法的返回值將返回給JVM,所以main()方法沒有返回值。正則表達式

使用Scanner獲取鍵盤輸入

使用Scanner類能夠很方便地獲取用戶的鍵盤輸入,Scanner是一個基於正則表達式的文本掃描器,能夠從文件、輸入流、字符串中解析出基本類型值和字符串值。數組

Scanner主要提供了兩個方法來掃描輸入安全

  • hasNextXxx():是否還有下一個輸入項,其中Xxx能夠是Int、Long等表明基本數據類型的字符串。若是隻是判斷是否包含下一個字符串,則直接使用hasNext()多線程

  • nextXxx():獲取下一個輸入項。併發

默認狀況下,Scanner使用空白(空格、Tab空白、回車)做爲多個輸入項之間的分隔符。dom

import java.util.Scanner;

public class ScannerKeyBoardTest 
{
    public static void main(String[] args) 
    {
        //System.in表明標準輸入,就是鍵盤輸入
        Scanner sc = new Scanner(System.in);
        //增長下面一行將只把回車做爲分隔符
        //sc.useDelimiter("\n");
        //判斷是否還有下一個輸入項
        while (sc.hasNext()) 
        {
            //輸出輸入項
            System.out.println("鍵盤輸入的內容是:"+ sc.next());
        }
    }
}

Scanner提供了兩個簡單的方法來逐行讀取ide

  • boolean hasNextLine():返回輸入源中是否還有下一行函數

  • String nextLine():返回輸入源中下一行的字符串

建立Scanner對象,傳入一個File對象做爲參數,程序將讀取ScannerFileTest.java文件中的內容

import java.io.File;
import java.util.Scanner;

public class ScannerFileTest 
{
    public static void main(String[] args) throws Exception
    {
        //將一個File對象做爲Scanner的構造器參數,Scanner讀取文件內容
        Scanner sc = new Scanner(new File("ScannerFileTest.java"));
        System.out.println("ScannerFileTest.java文件內容以下:");
        //判斷是否還有下一行
        while (sc.hasNextLine()) 
        {
            //輸出文件中的下一行
            System.out.println(sc.nextLine());
        }
    }
}

系統相關

System類

System類表明了當前Java程序的運行平臺,程序不能建立System類的對象,System類提供了一些類變量和類方法,容許直接經過System類來調用這些類變量和類方法。

加載文件和動態連接庫主要對naive方法有用,對於一些特殊的功能(如訪問操做系統底層硬件設備等)Java程序沒法實現必須藉助C語音來完成,此時須要使用C語音爲Java方法提供實現

  1. Java程序中聲明native修飾的方法,相似於abstract方法,只有方法簽名,沒有實現。編譯該Java程序,生成一個class文件

  2. 用javah編譯第1步生成的class文件,將生成一個.h文件

  3. 寫一個.cpp文件實現native,這一步須要包含第2步生成的.h文件(.h文件中包含JDK帶的jni.h文件)

  4. 將第3步的.cpp文件編譯成動態連接庫文件

  5. 在Java中用System類的loadLibrary..()方法或Runtime類的loadLibrary()方法加載第4步產生的動態連接庫文件,Java程序中就能夠調用這個native方法了。

import java.io.FileOutputStream;
import java.util.Map;
import java.util.Properties;

public class SystemTest 
{
    public static void main(String[] args) throws Exception
    {
        //獲取系統全部的環境變量
        Map<String, String> env = System.getenv();
        for(String name : env.keySet())
        {
            System.out.println(name + " ---> " + env.get(name));
        }
        //獲取指定環境變量的值
        System.out.println(System.getenv("JAVA_HOME"));
        //獲取全部的系統屬性
        Properties properties = System.getProperties();
        //將全部的系統屬性保存到properties.txt文件中
        properties.store(new FileOutputStream("properties.txt"), "System Properties");
        //輸出特定的系統屬性
        System.out.println(System.getProperty("os.name"));
    }
}

System類的in、out和err分別表明系統的標準輸入(一般是鍵盤)、標準輸出(一般是顯示器)和錯誤輸出流,並提供了setIn()、setOut()和setErr()方法

identityHashCode(Object x)方法,該方法返回指定對象的精確hashCode值,也就是根據該對象的地址計算獲得的hashCode值。若是兩個對象的identityHashCode值相同,則兩個對象絕對是同一個對象。

public class IdentityHashCodeTest 
{
    public static void main(String[] args) 
    {
        //下面程序中s1和s2是兩個不一樣的對象
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        //String重寫了hashCode()方法——改成根據字符序列計算hashCode值
        //由於s1和s2的字符序列相同,全部它們的hashCode()方法返回值相同
        System.out.println(s1.hashCode() + "---" + s2.hashCode());
        //s1和s2是不一樣的字符串對象,因此它們的identityHashCode值不一樣
        System.out.println(System.identityHashCode(s1) + "---" + System.identityHashCode(s2));
        String s3 = "Java";
        String s4 = "Java";
        //s3和s4是相同的字符串對象,因此它們的identityHashCode值相同
        System.out.println(System.identityHashCode(s3) + "---" + System.identityHashCode(s4));
    }
}

Runtime類

Runtime類表明Java程序的運行時環境,能夠訪問JVM的相關信息,如處理器數量、內存信息等。每一個Java程序都有一個與之對應的Runtime實例,應用程序經過該對象與其運行時環境相連。應用程序不能建立本身的Runtime實例,但能夠經過getRuntime()方法獲取與之關聯的Runtime對象。

Runtime類提供gc()方法和runFinalization()方法來通知系統進行垃圾回收、清理系統資源,並提供了load(String filename)和loadLibrary(String libname)方法來加載文件和動態連接庫。

public class ExecTest 
{
    public static void main(String[] args) throws Exception
    {
        //獲取Java程序關聯的運行時對象
        Runtime runtime = Runtime.getRuntime();
        System.out.println("處理器數量:" + runtime.availableProcessors());
        System.out.println("空閒內存數:" + runtime.freeMemory());
        System.out.println("總內存數:" + runtime.totalMemory());
        System.out.println("可用最大內存數" + runtime.maxMemory());
        //運行記事本程序
        runtime.exec("notepad.exe");
    }
}

經常使用類

Object類

Object類是全部類、數組、枚舉類的父類,Java容許把任何類型的對象賦給Object類型的變量。

  • boolean equals(Object obj):判斷指定對象與該對象是否相等

  • protected void finalize():當系統中沒有引用變量引用到該對象時,垃圾回收器調用該方法來清理該對象的資源

  • Class<?>getClass():返回該對象的運行時類

  • int hashCode():返回該對象的hashCode()值

  • String toString():返回該對象的字符串表示,當程序使用System.out.println()方法輸出一個對象,或者把某個對象和字符串進行鏈接運算時,系統會自動調用該對象的toString()方法返回該對象的字符串表示。

Java提供protected修飾的clone()方法,用於幫助其餘對象來實現「自我克隆」,須要被子類重寫或調用。

自定義類實現「克隆」的步驟

  1. 自定義類實現Cloneable接口

  2. 自定義實現本身的clone()方法

  3. 實現clone()方法時經過super.clone();調用Object實現的clone()方法來獲得該對象的副本,並返回該副本。

class Address
{
    String detail;
    public Address(String detail)
    {
        this.detail =detail;
    }
}
//實現Cloneable接口
class User implements Cloneable
{
    int age;
    Address address;
    public User(int age)
    {
        this.age = age;
        address = new Address("珠江新城");
    }
    //經過調用super.clone()來實現clone()方法
    public User clone() throws CloneNotSupportedException
    {
        return (User)(super.clone());
    }
}
public class CloneTest
{
    public static void main(String[] args) throws CloneNotSupportedException
    {
        User u1 = new User(27);
        //clone獲得u1對象的副本
        User u2 = u1.clone();
        //判斷u一、u2是否相同
        System.out.println(u1 == u2);
        //判斷u一、u2的address是否相同
        System.out.println(u1.address == u2.address);
    }
}

clipboard.png

Java7新增的Object類

若是不能肯定一個引用變量是否爲null,若是貿然地調用該變量的toString()方法,則可能引起NullPointerException異常;若是使用Object類提供的toString(Object o)方法,就不會引起空指針異常,當o爲null時,程序將返回一個"null"字符串。

Java爲工具類的命名習慣是添加一個字母s,好比操做數組的工具類Arrays,操做集合的工具類Collections。

import java.util.Objects;
public class ObjectsTest 
{
    //定義一個objectsTest變量,它的默認值是null
    static ObjectsTest objectsTest;
    public static void main(String[] args) 
    {
        //輸出一個null對象的hashCode值,輸出0
        System.out.println(Objects.hashCode(objectsTest));
        //輸出一個null對象的toString,輸出null
        System.out.println(Objects.toString(objectsTest));
        //要求objectsTest不能爲null,若是objectsTest爲null
        System.out.println(Objects.requireNonNull(objectsTest,"objectsTest參數不能是null!"));
    }
}

requireNonNull()方法,當傳入的參數不爲null時,該方法返回參數自己;不然將會引起NullPointerException異常。

Math類

構造器被定義成private的,所以沒法參加Math類的對象,全部方法都是類方法,能夠直接經過類名來調用它們,還提供了兩個類變量:PI和E

public class MathTest
{
    public static void main(String[] args)
    {
        /*---------下面是三角運算---------*/
        // 將弧度轉換角度
        System.out.println("Math.toDegrees(1.57):"
            + Math.toDegrees(1.57));
        // 將角度轉換爲弧度
        System.out.println("Math.toRadians(90):"
            + Math.toRadians(90));
        // 計算反餘弦,返回的角度範圍在 0.0 到 pi 之間。
        System.out.println("Math.acos(1.2):" + Math.acos(1.2));
        // 計算反正弦;返回的角度範圍在 -pi/2 到 pi/2 之間。
        System.out.println("Math.asin(0.8):" + Math.asin(0.8));
        // 計算反正切;返回的角度範圍在 -pi/2 到 pi/2 之間。
        System.out.println("Math.atan(2.3):" + Math.atan(2.3));
        // 計算三角餘弦。
        System.out.println("Math.cos(1.57):" + Math.cos(1.57));
        // 計算值的雙曲餘弦。
        System.out.println("Math.cosh(1.2 ):" + Math.cosh(1.2 ));
        // 計算正弦
        System.out.println("Math.sin(1.57 ):" + Math.sin(1.57 ));
        // 計算雙曲正弦
        System.out.println("Math.sinh(1.2 ):" + Math.sinh(1.2 ));
        // 計算三角正切
        System.out.println("Math.tan(0.8 ):" + Math.tan(0.8 ));
        // 計算雙曲正切
        System.out.println("Math.tanh(2.1 ):" + Math.tanh(2.1 ));
        // 將矩形座標 (x, y) 轉換成極座標 (r, thet));
        System.out.println("Math.atan2(0.1, 0.2):" + Math.atan2(0.1, 0.2));
        /*---------下面是取整運算---------*/
        // 取整,返回小於目標數的最大整數。
        System.out.println("Math.floor(-1.2 ):" + Math.floor(-1.2 ));
        // 取整,返回大於目標數的最小整數。
        System.out.println("Math.ceil(1.2):" + Math.ceil(1.2));
        // 四捨五入取整
        System.out.println("Math.round(2.3 ):" + Math.round(2.3 ));
        /*---------下面是乘方、開方、指數運算---------*/
        // 計算平方根。
        System.out.println("Math.sqrt(2.3 ):" + Math.sqrt(2.3 ));
        // 計算立方根。
        System.out.println("Math.cbrt(9):" + Math.cbrt(9));
        // 返回歐拉數 e 的n次冪。
        System.out.println("Math.exp(2):" + Math.exp(2));
        // 返回 sqrt(x2 +y2)
        System.out.println("Math.hypot(4 , 4):" + Math.hypot(4 , 4));
        // 按照 IEEE 754 標準的規定,對兩個參數進行餘數運算。
        System.out.println("Math.IEEEremainder(5 , 2):"
            + Math.IEEEremainder(5 , 2));
        // 計算乘方
        System.out.println("Math.pow(3, 2):" + Math.pow(3, 2));
        // 計算天然對數
        System.out.println("Math.log(12):" + Math.log(12));
        // 計算底數爲 10 的對數。
        System.out.println("Math.log10(9):" + Math.log10(9));
        // 返回參數與 1 之和的天然對數。
        System.out.println("Math.log1p(9):" + Math.log1p(9));
        /*---------下面是符號相關的運算---------*/
        // 計算絕對值。
        System.out.println("Math.abs(-4.5):" + Math.abs(-4.5));
        // 符號賦值,返回帶有第二個浮點數符號的第一個浮點參數。
        System.out.println("Math.copySign(1.2, -1.0):"
            + Math.copySign(1.2, -1.0));
        // 符號函數;若是參數爲 0,則返回 0;若是參數大於 0,
        // 則返回 1.0;若是參數小於 0,則返回 -1.0。
        System.out.println("Math.signum(2.3):" + Math.signum(2.3));
        /*---------下面是大小相關的運算---------*/
        // 找出最大值
        System.out.println("Math.max(2.3 , 4.5):" + Math.max(2.3 , 4.5));
        // 計算最小值
        System.out.println("Math.min(1.2 , 3.4):" + Math.min(1.2 , 3.4));
        // 返回第一個參數和第二個參數之間與第一個參數相鄰的浮點數。
        System.out.println("Math.nextAfter(1.2, 1.0):"
            + Math.nextAfter(1.2, 1.0));
        // 返回比目標數略大的浮點數
        System.out.println("Math.nextUp(1.2 ):" + Math.nextUp(1.2 ));
        // 返回一個僞隨機數,該值大於等於 0.0 且小於 1.0。
        System.out.println("Math.random():" + Math.random());
    }
}

Java 7的ThreadLocalRandom與Random

Random類專門用於生成一個僞隨機數,它有兩個構造器:一個構造器使用默認的種子(當前時間做爲種子),另外一個構造器須要程序員顯式傳入一個long型整數的種子

ThreadLocalRandom類是Java7新增的一個類,在併發訪問環境下,能夠減小多線程資源競爭,最終保證系統具備更好的線程安全性。提供靜態的current()方法來獲取ThreadLocalRandom對象,獲取該對象以後調用各類nextXxx()方法來獲取僞隨機數

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

public class RandomTest 
{
    public static void main(String[] args) 
    {
        Random random = new Random();
        System.out.println("random.nextBoolean():"+random.nextBoolean());
        byte[] buffer = new byte[16];
        random.nextBytes(buffer);
        System.out.println(Arrays.toString(buffer));
        //生成0.0~1.0之間的僞隨機double數
        System.out.println("random.nextDouble():"+random.nextDouble());
        //生成0.0~1.0之間的僞隨機float數
        System.out.println("random.nextFloat():"+random.nextFloat());
        //生成平均值是0.0,標準差是1.0的僞高斯數
        System.out.println("random.nextGaussian():"+random.nextGaussian());
        //生成0~26之間的僞隨機整數
        System.out.println("random.nextInt(26):"+random.nextInt(26));
        //生成一個處於long整數取值範圍的僞隨機整數
        System.out.println("random.nextLong():"+random.nextLong());
    }
}

Random使用一個48位的種子,若是這個類的兩個實例是用同一個種子建立的,對它們以一樣的順序調用方法,則它們會產生相同的數字序列。爲避免兩個Random對象產生相同的數字序列,推薦使用當前時間做爲Random對象的種子

Random rt = new Random(System.currentTimeMillis());
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
//生成一個4~20之間的僞隨機整數
int vall = threadLocalRandom.nextInt(4, 20);
//生成一個2.0~10.0之間的僞隨機浮點數
int vall2 = threadLocalRandom.nextDouble(2.0, 10.0);

BigDecimal類

BigDecimal能精確表示、計算浮點數。該類提供了大量的構造器用於建立BigDecimal對象,包括把全部基本數值型變量轉換成一個BigDecimal對象,也包括利用數字字符串、數字字符數組來建立BigDecimal對象。

BigDecimal(String val)構造器的結果是可預知的——寫入new BigDecimal("0.1")將建立一個BigDecimal對象,優先建議使用基於String的構造器

若是必須使用double浮點數做爲BigDecimal構造器的參數時, 不要直接將該double浮點數做爲構造器參數建立BigDecimal對象,而是經過BigDecimal.valueOf(double calue)靜態方法來建立BigDecimal對象

Java8的日期、時間類

Date類

Date():生成一個表明當前日期的Date對象
Date(long date):根據指定的long型整數來生成一個Date對象
boolean after(Date when):測試該日期是否在指定日期when以後
boolean before(Date when):測試該日期是否在指定日期when以前
long getTime():返回該時間對應的long型整數,即從GMT 1970-01-01 00:00:00到該Date對象之間的時間差,以毫秒爲計時單位
void setTime():設置該Date對象的時間

Calendar類

Calendar類是一個抽象類,因此不能使用構造器來建立Calendar對象。但它提供了幾個靜態getInstance()方法來獲取Calendar對象,這些方法根據TimeZone,Locale類來獲取特定的Calendar

Calendar類提供了大量訪問、修改日期時間的方法

  • void add(int field, int amount):根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量

  • int get(int field):返回給定日曆字段的值

  • int getActualMaximum(int field):返回指定日曆字段可能擁有的最大值

  • int getActualMinimum(int field):返回指定日曆字段可能擁有的最小值

  • void roll(int field, int amount):向指定日曆字段添加指定(有符號的)時間量,不更改更大的字段

  • void set(int field, int value):將給定的日曆字段設置爲給定值

  • void set(int year, int month, int date):設置日曆字段年、月、日的值

  • void set(int year, int month, int date, int hourOfDay, int minute):設置日曆字段年、月、日、時、分、秒的值。

public class CalendarTest
{
    public static void main(String[] args)
    {
        Calendar c = Calendar.getInstance();
        // 取出年
        System.out.println(c.get(YEAR));
        // 取出月份
        System.out.println(c.get(MONTH));
        // 取出日
        System.out.println(c.get(DATE));
        // 分別設置年、月、日、小時、分鐘、秒
        c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23
        System.out.println(c.getTime());
        // 將Calendar的年前推1年
        c.add(YEAR , -1); //2002-11-23 12:32:23
        System.out.println(c.getTime());
        // 將Calendar的月前推8個月
        c.roll(MONTH , -8); //2002-03-23 12:32:23
        System.out.println(c.getTime());

        Calendar cal1 = Calendar.getInstance();
        cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23
        cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23
        System.out.println(cal1.getTime());

        Calendar cal2 = Calendar.getInstance();
        cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31
        // 由於進位到後月份改成2月,2月沒有31日,自動變成29日
        cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29
        System.out.println(cal2.getTime());

        Calendar cal3 = Calendar.getInstance();
        cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23
        // MONTH字段「進位」,但YEAR字段並不增長
        cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23
        System.out.println(cal3.getTime());

        Calendar cal4 = Calendar.getInstance();
        cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31
        // MONTH字段「進位」後變成2,2月沒有31日,
        // YEAR字段不會改變,2003年2月只有28天
        cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28
        System.out.println(cal4.getTime());
    }
}

add與roll的區別

add(int field, int amount)

  • 當被修改的字段超過它容許的範圍時,會發生進位,即上一級字段會增大

  • 若是下一級字段也須要改變,那麼該字段會修正到變化最小的值

roll當被修改的字段超過它容許的範圍時,上一級字段不會增大,下一級字段的處理規則與add類似

Calendar的容錯性

public class LenientTest
{
    public static void main(String[] args)
    {
        Calendar cal = Calendar.getInstance();
        // 結果是YEAR字段加1,MONTH字段爲1(二月)
        cal.set(MONTH , 13);   //①
        System.out.println(cal.getTime());
        // 關閉容錯性
        cal.setLenient(false);
        // 致使運行時異常
        cal.set(MONTH , 13);   //②
        System.out.println(cal.getTime());
    }
}

①代碼能夠正常運行,YEAR字段加1;②代碼將會致使運行時異常,由於設置MONTH字段超出了MONTH字段容許的範圍。Calendar提供了一個setLenient()用於設置它的容錯性,Calendar默認支持較好的容錯性,經過setLenient(false)能夠關閉Calendar的容錯性,讓它嚴格的參數檢查。

Java8新增的日期、時間包

  • Clock:該類用於獲取指定時間的當前的日期、時間。該類可取代System類的currentTimeMillis()方法,並且提供了更多方法來獲取當前日期、時間。該類提供了大量靜態方法來獲取Clock對象

  • Duration:該類表明持續的時間

  • Instant:表明一個具體的時刻,能夠精確到納秒。提供了靜態now()方法來獲取當前時刻,也提供了靜態的now(Clock clock)方法來獲取clock對應的時刻。minusXxx()和plusXxx()方法在當前時刻的基礎上減去/加上一段時間

  • LocalDate:該類表明不帶時區的日期。供了靜態的now(Clock clock)方法來獲取clock對應的日期。minusXxx()和plusXxx()方法在當前年份基礎上減去/加上幾年、幾月、幾周或幾日

  • LocalTime:該類表明不帶時區的時間。供了靜態的now(Clock clock)方法來獲取clock對應的時間。minusXxx()和plusXxx()方法在當前年份基礎上減去/加上幾小時、幾分、幾秒等

  • LocalDateTime:該類表明不帶時區的日期、時間。供了靜態的now(Clock clock)方法來獲取clock對應的時間、日期。minusXxx()和plusXxx()方法在當前年份基礎上減去/加上幾年、幾月、幾周、幾日、幾小時、幾分、幾秒等

  • MonthDay:該類僅表示月日。提供了靜態的now(Clock clock)方法

  • Year:該類僅表示年。提供了靜態的now(Clock clock)方法。minusYears()和plusYears()方法
    -YearMonth:該類僅表明年月。提供了靜態的now(Clock clock)方法,minusXxx()和plusXxx()方法

  • ZonedDatetime:該類表明一個時區化的日期、時間

  • ZoneId:該類表明一個時區

  • DayofWeek:這是一個枚舉類週一到週六的枚舉

  • Mouth:該類也是一個枚舉類,定義一月到十二月的枚舉值

    public class NewDatePackageTest
    {

    public static void main(String[] args)
    {
        // -----下面是關於Clock的用法-----
        // 獲取當前Clock
        Clock clock = Clock.systemUTC();
        // 經過Clock獲取當前時刻
        System.out.println("當前時刻爲:" + clock.instant());
        // 獲取clock對應的毫秒數,與System.currentTimeMillis()輸出相同
        System.out.println(clock.millis());
        System.out.println(System.currentTimeMillis());
        // -----下面是關於Duration的用法-----
        Duration d = Duration.ofSeconds(6000);
        System.out.println("6000秒至關於" + d.toMinutes() + "分");
        System.out.println("6000秒至關於" + d.toHours() + "小時");
        System.out.println("6000秒至關於" + d.toDays() + "天");
        // 在clock基礎上增長6000秒,返回新的Clock
        Clock clock2 = Clock.offset(clock, d);
        // 可看到clock2與clock1相差1小時40分
        System.out.println("當前時刻加6000秒爲:" +clock2.instant());
        // -----下面是關於Instant的用法-----
        // 獲取當前時間
        Instant instant = Instant.now();
        System.out.println(instant);
        // instant添加6000秒(即100分鐘),返回新的Instant
        Instant instant2 = instant.plusSeconds(6000);
        System.out.println(instant2);
        // 根據字符串中解析Instant對象
        Instant instant3 = Instant.parse("2014-02-23T10:12:35.342Z");
        System.out.println(instant3);
        // 在instant3的基礎上添加5小時4分鐘
        Instant instant4 = instant3.plus(Duration
            .ofHours(5).plusMinutes(4));
        System.out.println(instant4);
        // 獲取instant4的5天之前的時刻
        Instant instant5 = instant4.minus(Duration.ofDays(5));
        System.out.println(instant5);
        // -----下面是關於LocalDate的用法-----
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        // 得到2014年的第146天
        localDate = LocalDate.ofYearDay(2014, 146);
        System.out.println(localDate); // 2014-05-26
        // 設置爲2014年5月21日
        localDate = LocalDate.of(2014, Month.MAY, 21);
        System.out.println(localDate); // 2014-05-21
        // -----下面是關於LocalTime的用法-----
        // 獲取當前時間
        LocalTime localTime = LocalTime.now();
        // 設置爲22點33分
        localTime = LocalTime.of(22, 33);
        System.out.println(localTime); // 22:33
        // 返回一天中的第5503秒
        localTime = LocalTime.ofSecondOfDay(5503);
        System.out.println(localTime); // 01:31:43
        // -----下面是關於localDateTime的用法-----
        // 獲取當前日期、時間
        LocalDateTime localDateTime = LocalDateTime.now();
        // 當前日期、時間加上25小時3分鐘
        LocalDateTime future = localDateTime.plusHours(25).plusMinutes(3);
        System.out.println("當前日期、時間的25小時3分以後:" + future);
        // 下面是關於Year、YearMonth、MonthDay的用法示例-----
        Year year = Year.now(); // 獲取當前的年份
        System.out.println("當前年份:" + year); // 輸出當前年份
        year = year.plusYears(5); // 當前年份再加5年
        System.out.println("當前年份再過5年:" + year);
        // 根據指定月份獲取YearMonth
        YearMonth ym = year.atMonth(10);
        System.out.println("year年10月:" + ym); // 輸出XXXX-10,XXXX表明當前年份
        // 當前年月再加5年,減3個月
        ym = ym.plusYears(5).minusMonths(3);
        System.out.println("year年10月再加5年、減3個月:" + ym);
        MonthDay md = MonthDay.now();
        System.out.println("當前月日:" + md); // 輸出--XX-XX,表明幾月幾日
        // 設置爲5月23日
        MonthDay md2 = md.with(Month.MAY).withDayOfMonth(23);
        System.out.println("5月23日爲:" + md2); // 輸出--05-23
    }

    }

相關文章
相關標籤/搜索