# 4.4 日期時間(Date)

在 `javascript/practice` 資料夾下，建立 `date.html` 來練習。

## 建立當下的日期物件

預設上會抓取瀏覽器上所設定的時區。建立當下的日期物件：

```javascript
var d = new Date(); // 建立一個日期物件
console.log(d);

// Sun Aug 02 2020 11:48:41 GMT+0800 (Taipei Standard Time)
```

## 指定日期時間的日期物件

共有7個參數，分別是年、月、日、時、分、秒、毫秒。

留意「**月**」的部份，0 是一月份；到 11 是十二月份。

例 1：(指定到 7  個參數(

```javascript
var d1 = new Date(2020, 7, 2, 12, 48, 10, 0);
var d2 = new Date(2020, 7, 2, 12, 48, 10, 1000);

console.log(d1); // Sun Aug 02 2020 12:48:10 GMT+0800 (Taipei Standard Time)
console.log(d2); // Sun Aug 02 2020 12:48:11 GMT+0800 (Taipei Standard Time)
```

例 2：(只指定 2 \~ 6 個參數)

```javascript
var d1 = new Date(2020, 7, 2, 12, 48, 10);
var d2 = new Date(2020, 7, 2, 12, 48);
var d3 = new Date(2020, 7, 2, 12);
var d4 = new Date(2020, 7, 2);
var d5 = new Date(2020, 7);


console.log(d1); // Sun Aug 02 2020 12:48:10 GMT+0800 (Taipei Standard Time)
console.log(d2); // Sun Aug 02 2020 12:48:00 GMT+0800 (Taipei Standard Time)
console.log(d3); // Sun Aug 02 2020 12:00:00 GMT+0800 (Taipei Standard Time)
console.log(d4); // Sun Aug 02 2020 00:00:00 GMT+0800 (Taipei Standard Time)
console.log(d5); // Sat Aug 01 2020 00:00:00 GMT+0800 (Taipei Standard Time)

```

例 3：(指定 1 個參數，指的是毫秒)

```javascript
var d1 = new Date(0);
var d2 = new Date(1000); // 代入的是「毫秒」，即視為第7個參數

console.log(d1); // Thu Jan 01 1970 08:00:00 GMT+0800 (Taipei Standard Time)
console.log(d2); // Thu Jan 01 1970 08:00:01 GMT+0800 (Taipei Standard Time)
```

{% hint style="info" %}
Unix Timestamp：指的是從 1970 年 1 月 1 日開始，一直到現在的「秒數」。
{% endhint %}

## 指定日期字串的日期物件

### YYYY-MM-DD HH:MM:SS

```javascript
var d1 = new Date("2020-08-02");
var d2 = new Date("2020-08-02 13:40:10");
var d3 = new Date("2020-08");

console.log(d1); // Sun Aug 02 2020 08:00:00 GMT+0800 (Taipei Standard Time)
console.log(d2); // Sun Aug 02 2020 13:40:10 GMT+0800 (Taipei Standard Time)
console.log(d3); // Sat Aug 01 2020 08:00:00 GMT+0800 (Taipei Standard Time)
```

### YYYY-MM-DDTHH:MM:SSZ

* **`T`**：大寫的 T，用來做為日期與時間的區隔。
* **`Z`**：表示的是 UTC 時區。
* 如果想要表達相對於 UTC 時區，就將 **`Z`** 移除，改成 **`+HH:MM`** 或 **`-HH:MM`**。

例 1：(留意輸出會是 `+8` 的時區)

```javascript
var d1 = new Date("2020-08-02T13:10:00Z");

console.log(d1); // Sun Aug 02 2020 21:10:00 GMT+0800 (Taipei Standard Time)
```

例 2：(改成 `+8` 時區)

```javascript
var d1 = new Date("2020-08-02T13:10:00Z");
var d2 = new Date("2020-08-02T13:10:00+08:00");

console.log(d1); // Sun Aug 02 2020 21:10:00 GMT+0800 (Taipei Standard Time)
console.log(d2); // Sun Aug 02 2020 13:10:00 GMT+0800 (Taipei Standard Time)
```

GMT 與 UTC 查詢參考：

![UTC 與 GMT](https://3126711450-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LokjetmQhrMQC7IVioJ%2F-MDhg73rWjC2nC_kw2d4%2F-MDhgzlR_Fei5R4ioNrY%2Futc_gmt.png?alt=media\&token=3b0c9774-aa33-4153-a103-424b257151c3)

## 日期相關操作

一旦日期物件建立了，那就可以使用以下相關操作：

### toString()

將日期物件的輸出轉成字串：

```javascript
var d1 = new Date();

console.log(d1.toString()); // Sun Aug 02 2020 13:57:50 GMT+0800 (Taipei Standard Time)
```

### 取得日期資訊

| 方法                | 說明                                |
| ----------------- | --------------------------------- |
| getFullYear()     | 取得四位數的西元年。                        |
| getMonth()        | **0 \~ 11。取得月份。0 代表一月，11 代表十二月。** |
| getDate()         | 1 \~ 31。取得日期。                     |
| getHours()        | 0 \~ 23。取得小時的部份。                  |
| getMinutes()      | 0 \~ 59。取得分鐘。                     |
| getSeconds()      | 0 \~ 59。取得秒數。                     |
| getMilliseconds() | 0 \~ 999。取得毫秒數。                   |
| getTime()         | **取得 Unix Timestamp，回傳毫秒數。**      |
| getDay()          | **0 \~ 6。取得星期幾。0 代表星期日，6 代表星期六**。 |
| **Date.now()**    | **與 getTime() 同。**                |

例：

```javascript
var d1 = new Date();

console.log(d1.getFullYear());     // 2020
console.log(d1.getMonth());        // 7
console.log(d1.getDate());         // 2
console.log(d1.getHours());        // 14
console.log(d1.getMinutes());      // 21
console.log(d1.getSeconds());      // 0
console.log(d1.getMilliseconds()); // 518
console.log(d1.getTime());         // 1596349260518
console.log(d1.getDay());          // 0
console.log(Date.now());           // 1596349260518
```

[unixtimestamp 網站](https://www.unixtimestamp.com/)

## 其它

* 1 天 = 24 小時 = 60 \* 60 \* 24 = 86400 秒 = 86400000 毫秒。

## 練習

完成以下函式，然後在 console 中輸出的結果是差「幾」天：

```javascript
function DateDiff(date1, date2) {
  
}

console.log( DateDiff("2019-12-31", "2020-01-02") ); // 2
console.log( DateDiff("2019-12-30", "2020-01-03") ); // 4
console.log( DateDiff("2019-12-30", "2019-12-30") ); // 0
```

參考作法：

{% embed url="<https://codepen.io/carlos411/pen/jOBPLdv>" %}

{% hint style="info" %}
累積自己的函式庫 **`my_funcs.js`**。
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.webmix.cc/javascript/4.-javascript-chang-yong-nei-jian-han-shi/4.4-date-object.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
