2012-07-17

Java 腦袋學 PHP Date

日期時間有兩種存在方式,秒數與字串,或者說是數值與字串,或者說是給電腦看的或給人看的。

存到資料庫的用數值,頁面呈現的用字串。

建立日期時間物件

取得數值的兩種方式:time()mktime()
// 取得目前時間
$now = time();

// 取得指定的時間,時分秒月日年
$past = mktime(3,4,5,1,2,2012);
格式化日期時間

取得字串的四種方式:date()strftime()getdate()localtime(),嚴格來說,後兩種是回傳陣列,前兩種才是回傳字串。
echo '<b>getdate()</b><br/>';
$gd = getdate();
foreach($gd as $key => $value) {
  echo $key.':'.$value.'<br/>';
}

echo '<b>getdate(mktime(15, 0, 0, 12, 25, 2011))</b><br/>';
$gd = getdate(mktime(15, 0, 0, 12, 25, 2011));
foreach($gd as $key => $value) {
  echo $key.':'.$value.'<br/>';
}

echo '<b>localtime()</b><br/>';
$lt = localtime();
foreach($lt as $key => $value) {
  echo $key.':'.$value.'<br/>';
}

echo '<b>localtime(time(), true)</b><br/>';
$lt = localtime(time(), true);
foreach($lt as $key => $value) {
  echo $key.':'.$value.'<br/>';
}
得到結果為
getdate()
seconds:38
minutes:52
hours:13
mday:17
wday:2
mon:7
year:2012
yday:198
weekday:Tuesday
month:July
0:1342504358

getdate(mktime(15, 0, 0, 12, 25, 2011))
seconds:0
minutes:0
hours:15
mday:25
wday:0
mon:12
year:2011
yday:358
weekday:Sunday
month:December
0:1324796400

localtime()
0:38
1:52
2:13
3:17
4:6
5:112
6:2
7:198
8:0

localtime(time(), true)
tm_sec:38
tm_min:52
tm_hour:13
tm_mday:17
tm_mon:6
tm_year:112
tm_wday:2
tm_yday:198
tm_isdst:0
將日期格式化為字串。
date('Y/m/d H:i:s'): 2012/07/17 13:52:38
date('y/n/j G:i:s'): 12/7/17 13:52:38

strftime('%Y/%m/%d %H:%M:%S'): 2012/07/17 13:52:38
strftime('%y/%m/%d %H:%M:%S'): 12/07/17 13:52:38

date('Y/m/d H:i:s', mktime(3, 4, 5, 1, 2, 2011)): 2011/01/02 03:04:05
date('y/n/j G:i:s', mktime(3, 4, 5, 1, 2, 2011)): 11/1/2 3:04:05

strftime('%Y/%m/%d %H:%M:%S', mktime(3, 4, 5, 1, 2, 2011)): 2011/01/02 03:04:05
strftime('%y/%m/%d %H:%M:%S', mktime(3, 4, 5, 1, 2, 2011)): 11/01/02 03:04:05
驗證日期
checkdate($m, $d, $y);
日期時間間隔
// 沒有方便的 function 可用
$a = mktime(3,4,5,7,2,2012);
$b = time();
$diff = $b - $a;
$diff_d = floor($diff/(24*60*60));
$diff -= $diff_d * 24 * 60 * 60;
$diff_h = floor($diff/(60*60));
$diff -= $diff_h * 60 * 60;
$diff_m = floor($diff/60);
$diff -= $diff_m * 60;
echo $diff_d.' days '.$diff_h.' hours '.$diff_m.' minutes '.$diff.' seconds';
解析日期時間字串
// 神奇的 strtotime()
// 數值
$a = mktime(3,4,5,7,2,2012);
// 轉成字串
$b = date('Y/m/d H:i:s', $a);
// 打回數值, $a == $c
$c = strtotime($b);
日期時間加加減減
// 數值
$a = mktime(3,4,5,2,29,2012);
echo date('Y/m/d H:i:s', $a).'
';
// 還是用神奇的 strtotime()
// 加一天
$b = strtotime('+1 day', $a);
echo date('Y/m/d H:i:s', $b).'
';
// 加一個月
$b = strtotime('+1 month', $a);
echo date('Y/m/d H:i:s', $b).'
';
// 加一年
$b = strtotime('+1 year', $a);
echo date('Y/m/d H:i:s', $b).'
';
// 輸出
2012/02/29 03:04:05
2012/03/01 03:04:05 // 加一天
2012/03/29 03:04:05 // 加一月
2013/03/01 03:04:05 // 加一年,有點奇怪
這個神奇的 strtotime() 比較適合用來加減「非固定長度」的時間間隔,這裡說得就是「月」,如果是固定間隔的,轉成數值用秒加減就可以了。

---

沒有留言:

張貼留言