2018/04/20

Date Time Control On PHP Python Node.js

寫程式時,時間的使用是頻率很高的事情,簡單的像是拿取現在的時間、timestamp,稍微複雜的像是計算兩個時間的差距,今天來探討一些常見的例子

  1. 現在的時間
  2. 現在的 timestamp
  3. 將時間轉換為 timestamp
  4. 從 timestamp 取得時間
  5. 格式化時間
  6. 時間位移
  7. 時間差異

PHP

<?php

// 現在的時間
// PHP 沒有函式可以直接印出現在的值,一般都是用 date 加上需要的格式
echo date('Y-m-d H:i:s'), PHP_EOL; // 2018-04-20 10:03:22

// 現在的 timestamp
echo time(), PHP_EOL; // 1524189866

// 將時間轉換為 timestamp
echo strtotime('2018-04-20'), PHP_EOL; // 1524153600

// 從 timestamp 取得時間
echo date('Y-m-d H:i:s', 1524153600), PHP_EOL; // 2018-04-20 00:00:00

// 格式化時間
// 基本上就是使用 date 再去指定內容,常見的就是 Ymd His
// 其他的部份可以參考 http://php.net/date

// 時間位移
// 範例為 2018-04-20 12:00:00,往前移動一天又一小時
$datetimeString = '2018-04-20 12:00:00';
$datetime = date('Y-m-d H:i:s', strtotime($datetimeString));
echo $datetime, PHP_EOL; // 2018-04-20 12:00:00

// strtotime 很強大,其他應用可以參考 http://php.net/strtotime
$datetime = date('Y-m-d H:i:s', strtotime('-1 day -1 hour', strtotime($datetimeString)));
echo $datetime, PHP_EOL; // 2018-04-19 11:00:00

// 時間差異
// 基本上就是轉 timestamp 再去換算
$dateBegin = '2018-04-19';
$dateEnd = '2018-04-20';
echo strtotime($dateEnd) - strtotime($dateBegin), PHP_EOL; // 86400

Python

python 常用的方法有 timedatetime,接下來的範例用 datetime 直接做掉

# -*- coding: utf-8 -*-

import datetime

# 現在的時間
print(datetime.datetime.now()) # 2018-04-20 10:18:19.916229

# 現在的 timestamp
print(datetime.datetime.now().strftime('%s')) # 1524190730

# 將時間轉換為 timestamp
print(datetime.datetime(2018, 4, 20).strftime('%s')) # 1524153600

# 從 timestamp 取得時間
print(datetime.datetime.fromtimestamp(1524153600)) # 2018-04-20 00:00:00

# 格式化時間
# 其他文字格式可以參考 http://tinyurl.com/ydz294lw
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) #2018-04-20 10:23:30

# 時間位移
datetime_string = '2018-04-20 12:00:00'
convert_datetime = datetime.datetime.strptime(datetime_string, '%Y-%m-%d %H:%M:%S')
print(convert_datetime) # 2018-04-20 12:00:00

# timedelta 很強大,其他可以參考 http://tinyurl.com/yc83qt4h
convert_datetime = convert_datetime - datetime.timedelta(days=1, hours=1)
print(convert_datetime) # 2018-04-19 11:00:00

# 時間差異
date_begin = '2018-04-19'
date_end = '2018-04-20'
begin = int(datetime.datetime.strptime(date_begin, '%Y-%m-%d').strftime('%s'))
end = int(datetime.datetime.strptime(date_end, '%Y-%m-%d').strftime('%s'))
print(end - begin) # 86400

Node.js

坦白說,如果你從網路上查詢 nodejs 或 jsavascript 對時間的控制大部分的人都會推薦你去使用套件,像是 moment.js,因為 JS 對時間的控制沒有那麼直覺跟友善,要花很多功夫才能達成,但我們今天就是研究 native 的東西,我們就用 native 的方法來完成

// 現在的時間
let date = new Date();
console.log(date.toString()); // Fri Apr 20 2018 11:32:22 GMT+0800

// 現在的 timestamp
console.log(date.getTime()); // 1524192512090

// 將時間轉換為 timestamp
const dateString = '2018-04-20';
date = new Date(Date.parse(dateString));
console.log(date.toString()); // Fri Apr 20 2018 08:00:00 GMT+0800 (CST)

// 從 timestamp 取得時間
date = new Date(1524192512090);
console.log(date.toString()); // Fri Apr 20 2018 10:48:32 GMT+0800 (CST)

// 格式化時間
// 這個就真的沒招了,不用套件的話得自己取值組合
date = new Date(1524192512090);
formatDate = date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) +
    '-' + ('0' + date.getDate()).slice(-2) + ' ' + date.getHours() + ':' +
    date.getMinutes() + ':' + date.getSeconds();
console.log(formatDate); // 2018-04-20 10:48:32

// 時間位移
const datetimeString = '2018-04-20 12:00:00';
const convertToDate = new Date(Date.parse(datetimeString));
const otherDate = new Date(
    convertToDate.getFullYear(), convertToDate.getMonth(), convertToDate.getDate() - 1,
    convertToDate.getHours() - 1, convertToDate.getMinutes(), convertToDate.getSeconds()
);
console.log(convertToDate.toString()); // Fri Apr 20 2018 12:00:00 GMT+0800 (CST)
console.log(otherDate.toString()); // Thu Apr 19 2018 11:00:00 GMT+0800 (CST)

// 時間差異
const dateBegin = '2018-04-19';
const dateEnd = '2018-04-20';
const begin = new Date(Date.parse(dateBegin));
const end = new Date(Date.parse(dateEnd));
console.log((end.getTime() - begin.getTime()) / 1000); // 86400

相信看完上面的範例以後,大家應該都會去裝 moment.js 了 XDDDD

沒有留言: