1. 程式人生 > >Java ——日期時間 日期時間相關類 隨機數 定義類屬性時建議使用引用數據類型

Java ——日期時間 日期時間相關類 隨機數 定義類屬性時建議使用引用數據類型

run equals als mat 年月日 註意 character sets 構造函數

本節重點思維導圖

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

Date對象創建

兩個構造函數:

  • Date() ----使用當前日期和時間來初始化對象
  • Date(long millisec) -----接收一個參數,該參數是從1970年1月1日起的毫秒數

Date對象創建以後,可以調用下面的方法

1 boolean after(Date date)
若當調用此方法的Date對象在指定日期之後返回true,否則返回false。
2 boolean before(Date date)

若當調用此方法的Date對象在指定日期之前返回true,否則返回false。
3 Object clone( )
返回此對象的副本。
4 int compareTo(Date date)
比較當調用此方法的Date對象和指定日期。兩者相等時候返回0。調用對象在指定日期之前則返回負數。調用對象在指定日期之後則返回正數。
5 int compareTo(Object obj)
若obj是Date類型則操作等同於compareTo(Date) 。否則它拋出ClassCastException。
6 boolean equals(Object date)
當調用此方法的Date對象和指定日期相等時候返回true,否則返回false。
7 long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。
8 int hashCode( )
返回此對象的哈希碼值。
9 void setTime(long time)

用自1970年1月1日00:00:00 GMT以後time毫秒數設置時間和日期。
10 String toString( )
把此 Date 對象轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

使用 SimpleDateFormat 格式化日期

import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String args[]) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");   //詳細格式說明見上方思維導圖
 
      System.out.println("當前時間為: " + ft.format(dNow));
   }
}

結果:

當前時間為: 2019-05-16 12:03:16

日期和時間的格式化編碼 【往下翻】

使用printf格式化日期

技術分享圖片

import java.util.Date;
 
public class DateDemo {
 
  public static void main(String args[]) {
     // 初始化 Date 對象
     Date date = new Date();
 
     //c的使用  
    System.out.printf("全部日期和時間信息:%tc%n",date);          
    //f的使用  
    System.out.printf("年-月-日格式:%tF%n",date);  
    //d的使用  
    System.out.printf("月/日/年格式:%tD%n",date);  
    //r的使用  
    System.out.printf("HH:MM:SS PM格式(12時制):%tr%n",date);  
    //t的使用  
    System.out.printf("HH:MM:SS格式(24時制):%tT%n",date);  
    //R的使用  
    System.out.printf("HH:MM格式(24時制):%tR",date);  
  }
}

結果:

全部日期和時間信息:星期四 五月 16 12:06:35 CST 2019-月-日格式:2019-05-16/日/年格式:05/16/19
HH:MM:SS PM格式(12時制):12:06:35 下午
HH:MM:SS格式(24時制):12:06:35
HH:MM格式(24時制):12:06

如果需要重復提供日期,那麽利用這種方式就有點復雜了。可以利用一個格式化字符串指出要被格式化的參數的索引

索引必須緊跟在%後面,而且必須以$結束

import java.util.Date;
public class DateDemo {
 
   public static void main(String args[]) {
       // 初始化 Date 對象
       Date date = new Date();
        
       // 使用toString()顯示日期和時間
       System.out.printf("%1$s %2$tB %2$td, %2$tY", 
                         "Due date:", date);
   }
}

結果:

Due date: 五月 16, 2019

可以使用 < 標誌。它表明先前被格式化的參數要被再次使用

import java.util.Date;
  
public class DateDemo {
 
   public static void main(String args[]) {
       // 初始化 Date 對象
       Date date = new Date();
        
       // 顯示格式化時間
       System.out.printf("%s %tB %<te, %<tY", 
                         "Due date:", date);
   }
}

結果:

Due date: 五月 16, 2019

定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串

import java.util.*;
  
public class DateDemo {
   public static void main(String args[]) {
       Date date=new Date();                                      
        //b的使用,月份簡稱  
        String str=String.format(Locale.US,"英文月份簡稱:%tb",date);       
        System.out.println(str);                                                                              
        System.out.printf("本地月份簡稱:%tb%n",date);  
        //B的使用,月份全稱  
        str=String.format(Locale.US,"英文月份全稱:%tB",date);  
        System.out.println(str);  
        System.out.printf("本地月份全稱:%tB%n",date);  
        //a的使用,星期簡稱  
        str=String.format(Locale.US,"英文星期的簡稱:%ta",date);  
        System.out.println(str);  
        //A的使用,星期全稱  
        System.out.printf("本地星期的簡稱:%tA%n",date);  
        //C的使用,年前兩位  
        System.out.printf("年的前兩位數字(不足兩位前面補0):%tC%n",date);  
        //y的使用,年後兩位  
        System.out.printf("年的後兩位數字(不足兩位前面補0):%ty%n",date);  
        //j的使用,一年的天數  
        System.out.printf("一年中的天數(即年的第幾天):%tj%n",date);  
        //m的使用,月份  
        System.out.printf("兩位數字的月份(不足兩位前面補0):%tm%n",date);  
        //d的使用,日(二位,不夠補零)  
        System.out.printf("兩位數字的日(不足兩位前面補0):%td%n",date);  
        //e的使用,日(一位不補零)  
        System.out.printf("月份的日(前面不補0):%te",date);  
   }
}

結果:

英文月份簡稱:May
本地月份簡稱:五月
英文月份全稱:May
本地月份全稱:五月
英文星期的簡稱:Thu
本地星期的簡稱:星期四
年的前兩位數字(不足兩位前面補0):20
年的後兩位數字(不足兩位前面補0):19
一年中的天數(即年的第幾天):136
兩位數字的月份(不足兩位前面補0):05
兩位數字的日(不足兩位前面補0):16
月份的日(前面不補0):16

解析字符串為時間

SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串

import java.util.*;
import java.text.*;
  
public class DateDemo {
 
   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 
 
      System.out.print(input + " Parses as "); 
 
      Date t; 
 
      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }
}

結果:

1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818

Calendar類

  • 設置和獲取日期數據的特定部分【比如小時,日,或者分鐘】
  • 在日期的這些部分加上或者減去值

一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可

技術分享圖片

技術分享圖片

Calendar類 對象信息的設置

Set設置

如:

Calendar c1 = Calendar.getInstance();

調用:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar對象c1的年月日分別設這為:2009、6、12

利用字段類型設置

如果只設定某個字段,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

把 c1對象代表的日期設置為10號,其它所有的數值會被重新計算

c1.set(Calendar.DATE,10);

把c1對象代表的年份設置為2008年,其他的所有數值會被重新計算

c1.set(Calendar.YEAR,2008);

其他字段屬性set的意義以此類推

Add設置

Calendar c1 = Calendar.getInstance();

把c1對象的日期加上10,也就是c1也就表示為10天後的日期,其它所有的數值會被重新計算

c1.add(Calendar.DATE, 10);

把c1對象的日期減去10,也就是c1也就表示為10天前的日期,其它所有的數值會被重新計算

c1.add(Calendar.DATE, -10);

其他字段屬性的add的意義以此類推

Calendar類對象信息的獲得

Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(註意(這個與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);

GregorianCalendar類

Calendar類實現了公歷日歷,GregorianCalendar是Calendar類的一個具體實現

Calendar 的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。GregorianCalendar定義了兩個字段:AD和BC。這是代表公歷定義的兩個時代。

構造方法 & 方法 【頁面最下方】

示例:求一段代碼的執行時間

import java.util.Date;

public class Demo {

    public static void main(String[] args) {
        long start = new Date().getTime();
        
        fun();
        
        long end = new Date().getTime();
        System.out.println(end-start);
    }

    private static void fun() {
        for(int i =0;i<999;i++) {
            for(int j =0;j<999;j++) {
                System.out.println();
            }
        }
    }

}

示例:定義一個學生類,要求記錄學生的學號、姓名、年齡、性別(用字符類型開示)、成績、是否掛過科(用boolean)

定義類的屬性時,要優先使用引用數據類型

public class Student {
    // 學號、姓名、年齡、生日 性別(用字符類型開示)、成績、是否掛過科
    private String id;
    private String name;
    private Integer age;
    private Date birth;
    private Character gender;
    private Float score;
    private Boolean guaKe;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String id, String name, Integer age, Date birth, Character gender, Float score, Boolean guaKe) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.birth = birth;
        this.gender = gender;
        this.score = score;
        this.guaKe = guaKe;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Character getGender() {
        return gender;
    }

    public void setGender(Character gender) {
        this.gender = gender;
    }

    public Float getScore() {
        return score;
    }

    public void setScore(Float score) {
        this.score = score;
    }

    public Boolean getGuaKe() {
        return guaKe;
    }

    public void setGuaKe(Boolean guaKe) {
        this.guaKe = guaKe;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", birth=" + birth + ", gender=" + gender
                + ", score=" + score + ", guaKe=" + guaKe + "]";
    }

}

SimpleDateFormat(要100%掌握)

日期格式化工具類

//   https://blog.csdn.net/gubaohua/article/details/575488/
public class Demo {

    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        System.out.println(date);
        //1999年9月21日
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String format = sdf.format(date);
        System.out.println(format);
        
        String dateStr = "1999-9月21日";
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM月dd日");
        Date parse = sdf2.parse(dateStr);
        System.out.println(parse);
        
    }

}

LocalDate(要求掌握,一般要求)

參考頁面:https://blog.csdn.net/tracycater/article/details/73017089

public class Demo {

    public static void main(String[] args) {
        // fun();

        /*
         * Date date = new Date(); LocalDate localDate = date2LocalDate(date);
         * System.out.println(date); System.out.println(localDate);
         */
        
        LocalDate localDate = LocalDate.now();
        Date date = localDate2Date(localDate);
        System.out.println("LocalDate = " + localDate);
        System.out.println("Date = " + date);
        
        Date localDate2Date = localDate2Date(LocalDate.parse("1999-09-21"));
        System.out.println(localDate2Date);
        
    }
    /**
     * 將LocalDate轉換成Date
     * @param localDate
     * @return
     */
    public static Date localDate2Date(LocalDate localDate) {
        ZoneId zoneId = ZoneId.systemDefault();
        
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

        return Date.from(zdt.toInstant());
    }

    /**
     * 將Date轉換成LocalDate
     * @param date
     * @return
     */
    public static LocalDate date2LocalDate(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();

        // atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        return localDate;
    }

    private static void fun() {
        LocalDate localDate = LocalDate.now();
        System.out.println("The local date is :: " + localDate);

        System.out.println("The number of days available for this month:: " + localDate.lengthOfMonth());
        // Know the month name
        System.out.println("What is the month name? :: " + localDate.getMonth().name());
        // add 2 days to the today‘s date.
        System.out.println(localDate.plus(2, ChronoUnit.DAYS));
        // substract 2 days from today
        System.out.println(localDate.minus(2, ChronoUnit.DAYS));

        LocalDate parse = LocalDate.parse("2018-09-21");
        System.out.println(parse);
        System.out.println(parse.getYear());
    }

}

Random

用來產生隨機數

public static void main(String[] args) {
        Random random = new Random();
        int nextInt = random.nextInt();
        System.out.println(nextInt);
        int nextInt2 = random.nextInt(10); //[0,10)
        System.out.println(nextInt2);
    }

Math

包含和數學相關的東西,其內部所有的內容都是static的

產生一個[m,n)之間的隨機數:

Math.random()*(n-m)+m      
  public static void main(String[] args) {
        System.out.println(Math.E);
        System.out.println(Math.sqrt(9));
        System.out.println(Math.ceil(3.2));
        System.out.println(Math.ceil(3.8));
        System.out.println(Math.ceil(-3.2));
        
        System.out.println(Math.floor(3.2));
        System.out.println(Math.floor(-3.2));
        
        System.out.println(Math.pow(3, 4));
        
        double random = Math.random();//[0,1)
        System.out.println(random);
        
        //1000~9999
        for(int i =1;i<=500;i++) {
            int d = (int) (Math.random()*8999+1000);
            System.out.print(d+" \t");
            if(i%10==0)
                System.out.println();
        }
        
        System.out.println(Math.abs(-8));
        System.out.println(Math.max(8, 10));
        System.out.println(Math.min(3, -5));
    }

Java ——日期時間 日期時間相關類 隨機數 定義類屬性時建議使用引用數據類型