[TOC]
# Date
在JavaScript中,`Date`對象用來表示日期和時間。
要獲取系統當前時間,用:
~~~
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份,注意月份范圍是0~11,5表示六月
now.getDate(); // 24, 表示24號
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小時制
now.getMinutes(); // 49, 分鐘
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒數
now.getTime(); //1435146562875, 獲取時間戳,以number形式表示的時間戳,單位是毫秒
~~~
如果要創建一個指定日期和時間的`Date`對象,可以用:
~~~
var d = new Date(2015, 5, 19, 20, 15, 30, 123);
d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST)
~~~
你可能觀察到了一個非常非常坑爹的地方,就是JavaScript的月份范圍用整數表示是0~11,`0`表示一月,`1`表示二月……,所以要表示6月,我們傳入的是`5`!這絕對是JavaScript的設計者當時腦抽了一下,但是現在要修復已經不可能了。
第二種創建一個指定日期和時間的方法是解析一個符合[ISO 8601](http://www.w3.org/TR/NOTE-datetime)格式的字符串:
~~~
var d = Date.parse('2015-06-24T19:49:22.875+08:00');
d; // 1435146562875
~~~
但它返回的不是`Date`對象,而是一個時間戳。不過有時間戳就可以很容易地把它轉換為一個`Date`:
~~~
var d = new Date(1435146562875);
d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
~~~
# 時區
`Date`對象表示的時間總是按瀏覽器所在時區顯示的,不過我們既可以顯示本地時間,也可以顯示調整后的UTC時間:
~~~
var d = new Date(1435146562875);
d.toLocaleString(); // '2015/6/24 下午7:49:22',本地時間(北京時區+8:00),顯示的字符串與操作系統設定的格式有關
d.toUTCString(); // 'Wed, 24 Jun 2015 11:49:22 GMT',UTC時間,與本地時間相差8小時
~~~
那么在JavaScript中如何進行時區轉換呢?實際上,只要我們傳遞的是一個`number`類型的時間戳,我們就不用關心時區轉換。任何瀏覽器都可以把一個時間戳正確轉換為本地時間。
# 時間戳
時間戳是一個自增的整數,它表示從1970年1月1日零時整的GMT時區開始的那一刻,到現在的毫秒數。
> 假設瀏覽器所在電腦的時間是準確的,那么世界上無論哪個時區的電腦,它們此刻產生的時間戳數字都是一樣的,所以,時間戳可以精確地表示一個時刻,并且與時區無關。
所以,我們只需要傳遞時間戳,或者把時間戳從數據庫里讀出來,再讓JavaScript自動轉換為當地時間就可以了。
# 時間格式化顯示
> 軟件開發過程中,存儲時間一般記錄自從1970年1月1日0點0分0秒開始至今的秒數(整數)。顯示的時候需要把這個整數格式化為可讀的方式顯示。我們將這一功能編寫為一個函數datetime,該函數將輸入的毫秒為單位的時間轉化為可讀格式,因此如果數據庫中存儲的計量單位是秒,需要乘以1000轉換為毫秒。
例如:2019-05-12 22:26:48,轉換為時間戳(秒)1557671208
```
<html>
<head>
<script>
function datetime(date = new Date(), format) {
format = format || 'YYYY-MM-DD HH:mm:ss';
const fn = function (d) {
return ('0' + d).slice(-2);
};
const d = new Date(date);
const formats = {
YYYY: d.getFullYear(),
MM: fn(d.getMonth() + 1),
DD: fn(d.getDate()),
HH: fn(d.getHours()),
mm: fn(d.getMinutes()),
ss: fn(d.getSeconds())
};
return format.replace(/([a-z])\1+/ig, function (a) {
return formats[a] || a;
});
}
const date_str = datetime(1557671208000, 'YYYY-MM-DD HH:mm');
console.log(date_str)
</script>
</head>
<body>
</body>
</html>
```
控制臺輸出
```
2019-05-12 22:26
```
- 內容介紹
- EcmaScript基礎
- 快速入門
- 常量與變量
- 字符串
- 函數的基本概念
- 條件判斷
- 數組
- 循環
- while循環
- for循環
- 函數基礎
- 對象
- 對象的方法
- 函數
- 變量作用域
- 箭頭函數
- 閉包
- 高階函數
- map/reduce
- filter
- sort
- Promise
- 基本對象
- Arguments 對象
- 剩余參數
- Map和Set
- Json基礎
- RegExp
- Date
- async
- callback
- promise基礎
- promise-api
- promise鏈
- async-await
- 項目實踐
- 標簽系統
- 遠程API請求
- 面向對象編程
- 創建對象
- 原型繼承
- 項目實踐
- Classes
- 構造函數
- extends
- static
- 項目實踐
- 模塊
- import
- export
- 項目實踐
- 第三方擴展庫
- immutable
- Vue快速入門
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入門
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 混入
- 過濾器
- 項目實踐
- 標簽編輯
- iView
- iView快速入門
- 課程講座
- 環境配置
- 第3周 Javascript快速入門