[Perl&PHP] time() and Class::Date 日期轉換運算

為了看個 MLB 美國職棒,寫了一個網站:美國職棒影片收集站,裡面的內容影片連結,以及連結說明,都是利用 Perl 搭配 MySQL 資料庫,以及 CodeIgniter PHP Framework 寫出來的,美國 MLB 開打時間,會比台灣晚一天的時差,所以在 PHP 跟 Perl 都要針對時間作修改以及轉換運算,那底下會寫 PHP 跟 Perl 如何控制時間,還有資料庫如何設計,會比較適當。

PHP 日期轉換 MySQL 在資料庫時間格式方面,最主要常見的兩種儲存方式,一種就是 MySQL 預設 datetime,顯示的格式就會像是

2009-11-03 20:10:43,另一種就是存成 UNIX time 格式,可以設定為 int(11),這兩種其實都可以使用,在 phpBB2 是採用後者的方式,因為 open source 要支援多種資料庫,但是又要統一程式碼,所以乾脆用 UNIX 的時間標記,這樣比較好轉換時區,如果使用 UNIX 格式,可以利用 time() 函式來取的。

#
# 得到目前系統 UNIX 時間
echo time();
# 下個禮拜時間
$nextWeek = time() + (7 * 24 * 60 * 60);
# 7 days; 24 hours; 60 mins; 60secs
# 另一種可以用 mktime 來取得系統 UNIX 時間
# 今天日期的 UNIX 時間
echo mktime(0,0,0, date("Y"),date("m"),date("d"));
所以我們可以存放到 mysql 資料庫,利用 time() 來 INSERT,接下來如何顯示時間:

date() 函式

# 利用 date() 函式
$time = time();
echo date("Y-m-d H:i:s", $time);
$nextWeek = time() + (7 * 24 * 60 * 60);
echo date("Y-m-d H:i:s", $nextWeek);
如果資料庫格式用 datetime,那取出來的值必定是

Y-m-d H:i:s 格式,那如何轉成 UNIX time 呢,可以用 strtotime

#
# 將標準時間放入第一參數
echo strtotime("2009-10-10 20:22:10");
echo strtotime("now");
結論是 1. 如果資料庫用 int(11),就利用 date(), mktime(), time() 轉換成時間格式 2. 如果資料庫用 datetime,就利用 strtotime() 轉換成 UNIX time 來做日期相加減

Perl 日期轉換

CPAN 裡面找到 Class-Date,裡面就有我想要的日期相加減,以及如何轉換到昨天前天格式,FreeBSD 請找到 devel/p5-Class-Date

cd /usr/ports/devel/p5-Class-Date; make install clean
使用方法請參考底下:
# creating absolute date object (local time) 建立日期物件
$date = now; #同等於 $date = date(time);
# getting values of an absolute date object 取得物件內容
$date->year;        # year, e.g: 2001
$date->_year;       # year - 1900, e.g. 101
$date->yr;          # 2-digit year 0-99, e.g 1
$date->mon;         # month 1..12
$date->day;         # day of month
$date->epoch;       # UNIX time_t 取得 UNIX 時間
# 美國時間減一天
my $now = now - '1D';
my $now_day = sprintf("%04d-%02d-%02d", $now->year, $now->month, $now->mday);
my $now_month = sprintf("%04d-%02d", $now->year, $now->month);

See also