---
# System prepended metadata

title: '20220305-java假日班筆記-CH02:Text-base Applications、取得日期與時間'
tags: [Calendar, StringTokenizer, java.sql.Date, java.util.Date, StringBuffer, Tibame-java入門班, StringBuilder, GregorianCalendar]

---

###### tags: `Tibame-java入門班`,`StringBuffer`,`StringBuilder`,`StringTokenizer`,`Calendar`,`GregorianCalendar`,`java.util.Date`,`java.sql.Date`
# 20220305-java假日班筆記-CH02:Text-base Applications、取得日期與時間


●**String類別與StringBuffer類別**
---

   String類別→immutable(記憶體空間不可變動)
   
   StringBuffer類別→mutable、thread-safe(記憶體可變動、速度慢)
   →串接英雄(字串要串接用這個比較好)
   
   
   
   ●字串串接-append
   **((串接英雄))**
   (方法越多越好，因為overroding，怎麼用都會過)
   
   ![](https://i.imgur.com/hAlUNBo.png)

   
   String與StringBuffer因記憶體位置不同，不可比較。


●用StringBuffer的append串接字串
![](https://i.imgur.com/UviNMRc.png)

●用insert插入字串
第一個數字為索引，由0起算。

![](https://i.imgur.com/9FtqiEm.png)

●用delete刪除字串
第一個是刪除的開始索引值，第二個數字則是結束的索引值(但是最後的那個位置並不刪除)
如範例的話，刪除的索引為6~9的字串(所以是java的字串被刪除)

![](https://i.imgur.com/kFbLZkz.png)

●用replace取代字串

![](https://i.imgur.com/kDljQRq.png)

String與StringBuffer兩者比較

```
    /*額外額外2:
    -StringBuffer類別是在原字串所在記憶體位置改變字串內容 
    -未覆寫(Override) Object類別的 equals() 及 hashCode() 方法*/	
    
               StringBuffer sb1 = new StringBuffer("AB");
		System.out.println("sb1="+sb1);       //AB
		
		StringBuffer sb2 = sb1.append("CD");
		System.out.println("sb1="+sb1);       //ABCD(同記憶體空間)
		System.out.println("sb2="+sb2);       //ABCD
		
		System.out.println(sb1==sb2);         //true
		System.out.println(sb2.equals(sb1));  //true 
```
   
``` String sb1 = new String("AB");
		System.out.println("sb1="+sb1);       //AB
		
		String sb2 = sb1+"CD";
		System.out.println("sb1="+sb1);       //AB
		System.out.println("sb2="+sb2);       //ABCD
		
		System.out.println(sb1==sb2);         //false
		System.out.println(sb2.equals(sb1));  //false
```

●**StringBuilder類別**(可變、執行緒不安全)(速度快)
---
 →JDK1.5新類別(為StringBuffer的新類別)
 特性除了執行緒變得不安全、速度變快(因為變成沒有控制存取)外，其餘特性相同。
 
 ![](https://i.imgur.com/LxqsuzV.png)
![](https://i.imgur.com/WKpiLyW.png)

 ---
 ●小整理：
 老類別內有三支由JVM鎖定的API→
 1.StringBuffer
 2.Vector
 3.Hashtable

 ---
●**StringTokenizer類別**(標記解析者)
---
  →將字串分成數個字串(token)<程式碼較複雜時很強大>
  
 此標記有兩個方法：
 1、hasMoreTokens(有更多的標記嗎?
 )
→ 會回傳布林值，為TRUE的話，就會往2移動。 
 ![](https://i.imgur.com/OgjtFK7.png)

 
  ![](https://i.imgur.com/KsHQs7t.png)
2、nextToken

→第一個位子為要判別的字串內容，第二個位子則是以什麼來判定的符號。
就會自動幫忙拆好印出。
![](https://i.imgur.com/1N692Ft.png)
![](https://i.imgur.com/Xbajdpc.png)

與String的split的分割做比較。
答案是相同的。

(最好的方法
[ ]+>>任意多個字元


![](https://i.imgur.com/33KlOk9.png)

用StringTokenizer去除多餘的空格

![](https://i.imgur.com/fBRJWxF.jpg)

  
```
import java.util.*;

public class TestTokenizer_String{

    public static void main(String args[]) {
        
        StringTokenizer st = new StringTokenizer("This is a book");//以空格當預設符號，不用指定
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
        
        StringTokenizer st1 =  new StringTokenizer("That-is-a-pen","-");//在" "內的內容做為分割標準，隨便的字元都能自動判斷。
        //但是最方便的方法就是用[]+打包任意字元就能分割。
        while (st1.hasMoreTokens()) {
           System.out.println(st1.nextToken());
        }
    
    }
}
```
![](https://i.imgur.com/qSJZD1l.png)

------
**●取得日期和時間**
-----


|           常數名                         |   值   |
|:--------------------------------------- |:------:|
|                                         |        |
| Calendar.YEAR                           |   年   |
| Calendar.MONTH(陣列)              ( +1) |   月   |
| Calendar.DATE                           |   日   |
| Calendar.HOUR_OF_DAY                    | 24時制 |
| Calendar.MINUTE                         |   分   |
| Calendar.SECOND                         |   秒   |
| Calendar.DAY_OF_WEEK              (-1)  | 星期幾 |


**①Calendar(父類別)**-單純列印出現在時間(抽象方法，不可new)
---      
→取得今天的日期與現在時間


(星期天為第一天為基準，所以需要-1)
    



只能取當下的時間
是抽象類別，不能建立new
![](https://i.imgur.com/20KawfY.png)

```
import java.util.*;
class Calendar_Time_Week {
  
  static String[] week =
          {"日","一","二","三","四","五","六"};
         //1    2    3    4    5   6    7(天)
         //0    1    2    3    4   5    6(索引值)
  public static void main(String args[]) {
    Calendar cal = Calendar.getInstance();//取當下值
    int y = cal.get(Calendar.YEAR);
    int m = cal.get(Calendar.MONTH) + 1;
    int d = cal.get(Calendar.DATE);
    int h = cal.get(Calendar.HOUR_OF_DAY);
    int min = cal.get(Calendar.MINUTE);
    int sec = cal.get(Calendar.SECOND);
    System.out.print("今天是: ");
    System.out.println(y + "年" + m + "月" + d + "日");
    System.out.print("現在是: ");
    System.out.println(h + "點" + min + "分" + sec + "秒");

    int w = cal.get(Calendar.DAY_OF_WEEK)-1;
    System.out.println("星期" + week[w]);
  }
}
```



**②GregorianCalendar(子類別)**
---
→可以指定想要印出什麼時間



●要指定日期去尋找星期幾

![](https://i.imgur.com/YfldoGc.png)
![](https://i.imgur.com/AV4GQZd.png)

![](https://i.imgur.com/4aYQ5r0.png)

![](https://i.imgur.com/kPelVB8.png)


**③java.util.Date類別**
---
可直接new。
一樣是抓現在的時間。

★利用java.util.Date的**getTime()** 方法，可得到自1970年1月1日午夜起起算的時間毫秒
(毫秒在手，世界都有)
(可以轉換為資料庫需要的時間模式)

**java江湖口訣>>要什麼給什麼~**

●程式碼原始型態(無法進資料庫)
![](https://i.imgur.com/LAPXPCe.png)

●取出毫秒

![](https://i.imgur.com/AlOiR6T.png)

![](https://i.imgur.com/2oJpeBj.png)

可以進入DB
![](https://i.imgur.com/5hOCK5T.jpg)



④java.sql.Date
---

30天候的後面需加L，才不會超過int的範圍
![](https://i.imgur.com/mroaAES.png)


轉成毫秒、轉成DB可讀取的時間格式、時分秒、與日期跟時分秒的結合
![](https://i.imgur.com/dY3HiTg.jpg)
![](https://i.imgur.com/Dazk1rE.png)


此程式碼可以互轉(比較囉嗦)
>>產出結果，可以跟資料庫交談
![](https://i.imgur.com/w3yeWhG.png)


![](https://i.imgur.com/N5jUH4C.png)

此程式碼比較精簡，但比較適用於取現在時間

![](https://i.imgur.com/5Akr0LH.png)
