###### 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,怎麼用都會過)

String與StringBuffer因記憶體位置不同,不可比較。
●用StringBuffer的append串接字串

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

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

●用replace取代字串

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的新類別)
特性除了執行緒變得不安全、速度變快(因為變成沒有控制存取)外,其餘特性相同。


---
●小整理:
老類別內有三支由JVM鎖定的API→
1.StringBuffer
2.Vector
3.Hashtable
---
●**StringTokenizer類別**(標記解析者)
---
→將字串分成數個字串(token)<程式碼較複雜時很強大>
此標記有兩個方法:
1、hasMoreTokens(有更多的標記嗎?
)
→ 會回傳布林值,為TRUE的話,就會往2移動。


2、nextToken
→第一個位子為要判別的字串內容,第二個位子則是以什麼來判定的符號。
就會自動幫忙拆好印出。


與String的split的分割做比較。
答案是相同的。
(最好的方法
[ ]+>>任意多個字元

用StringTokenizer去除多餘的空格

```
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());
}
}
}
```

------
**●取得日期和時間**
-----
| 常數名 | 值 |
|:--------------------------------------- |:------:|
| | |
| 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

```
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(子類別)**
---
→可以指定想要印出什麼時間
●要指定日期去尋找星期幾




**③java.util.Date類別**
---
可直接new。
一樣是抓現在的時間。
★利用java.util.Date的**getTime()** 方法,可得到自1970年1月1日午夜起起算的時間毫秒
(毫秒在手,世界都有)
(可以轉換為資料庫需要的時間模式)
**java江湖口訣>>要什麼給什麼~**
●程式碼原始型態(無法進資料庫)

●取出毫秒


可以進入DB

④java.sql.Date
---
30天候的後面需加L,才不會超過int的範圍

轉成毫秒、轉成DB可讀取的時間格式、時分秒、與日期跟時分秒的結合


此程式碼可以互轉(比較囉嗦)
>>產出結果,可以跟資料庫交談


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