PHP日期處理

PHP 日期基本處理


從日期字串求星期幾的方法$week=Array("日","一","二","三","四","五","六");
$date_time="2013-06-21 15:05:24";
list($date)=explode(" ", $date_time); //取出日期部份
list($Y,$M,$D)=explode("-",$date); //分離出年月日以便製作時戳
echo $date."  (星期".$week[date(“w”, mktime(0,0,0,$M,$D,$Y))].")";

內容整理:
什麼是timestamp ?
Unix時間戳:
取得某個時間與php timestamp 時間戳
代表的是該時間與Unix紀元的時間差,通常以秒為時間單位。
Unix紀元是1970年1月1日00:00:00

使用mktime時 只能在Unix紀元前  
小心得:
大部分的ˊ處理都是使用timestamp 所以取得日期後第一件事情最好先轉換為timestamp 測試時或ˋ是結尾輸出時再轉為日期就好

問題1: 日期加減處理

Ans1:
//十天後
echo date("Y-m-d" , mktime(0,0,0,date("m"),date("d")+10,date("Y")) );
//三個月後
echo date("Y-m-d" , mktime(0,0,0,date("m")+3,date("d"),date("Y")) );

Ans2:指定時間+3年
$today = '2013-04-19';
echo date("Y-m-d", strtotime($today."+3 year"));
echo date("Y-m-d", strtotime($today."-1 month"));

Ans3:指定時間+7天
$day = '2013-04-19';
$NewDate = date('Y-m-d', strtotime($day . " +7 days"));
echo $NewDate;

問題2:選定的時間點之間有多少天

Ans:
<?
$a=”2012-01-05”;
$b=”2014-01-05”;
$t=strtotime($b)-strtotime($a);//秒
echo "$a 到 $b 有".sec_to_date($t);
//自定義方法秒轉換日
        function sec_to_date($t)
    {
        $Day=$t/(24*60*60);
        echo $Day.”天”;        
    }
?>

問題3:選定的兩個時間之間有幾個六日 幾個工作日 總共幾天

Ans:
<?    //自訂義方法 多少秒轉換多少天數
      function sec_to_date($t)
    {
        $Day=$t/(24*60*60);
        return $Day;      
    }
?>   
### 求出指定時間區間內 得出多少工作日  多少例假日 總共幾天 ###
<?
        $DateA="2016-09-01";                          //指定時間區間開頭
        $DateB="2016-10-02";                          //指定時間區間結尾
        $DateRe=date("N",strtotime($DateA));   //$DateA暫存
        $DateHol=0;                                        //例假日
        $DateTol=0;                                        //總天數
        $DateWork=0;                                     //工作天
        $re=0;                                                //暫存變數
        if($DateRe==7)    //如果開頭是在禮拜日 放假日就是一天
        {
        $re=1;
        $DateRe=strtotime("next Monday",strtotime($DateA));
        $DateHol=1;
        }
        else //其餘放假日都是兩天
        {
        $re=8-$DateRe;
        $DateRe=strtotime("next Monday",strtotime($DateA));
        $DateHol=2;
        }
        $DateRe= date('Y-m-d',$DateRe);
        $DateTol=strtotime($DateB)-strtotime($DateRe);   //此行日期相差轉換為多少秒
        $DateTol=sec_to_date($DateTol);                        //單位轉換回日
        $DateHol+=((int)($DateTol/7))*2;
        if(date("N",strtotime($DateB)==7))                      //如果日期計算結束在星期日之前 前面的星期六也要算進去假日內
        $DateHol++;
        $DateTol+=$re;
        $DateWork=$DateTol-$DateHol;
        echo "從$DateA 到$DateB <br>";
        echo "總共放假:".$DateHol."天"."工作了:".$DateWork."天";
        echo "<br> 總天數為".$DateTol;
        
    ?>

問題4:民國轉西元

Ans1:
$ROCYear=date(date("Y")-1911);

Ans2:
<?
$taiwan_date_two = new DateTime("now");
$taiwan_date_two->modify("-1911 year");
//由於Y為四位數,利用ltrim去0
echo '$taiwan_date_two:'.ltrim($taiwan_date_two->format("Y"),"0");
?>

問題5:日期格式處理(PHP都是先轉換為timestamp 再轉為日期)

Ans:
echo $date;
echo strtotime($date)."<br>";
echo date("Y/m/d H:i:s",strtotime($date)).'<p>';
$date='October 18 2014 11:17:23AM';
echo $date.'<br>';
echo date("Y/m/d H:i:s",strtotime($date)).'<p>';

問題6:判斷指定日期為星期幾

Ans:
$Date="2016/9/30";
echo "今天星期".date("N",strtotime($Date));

問題7:取得Gmt的timestramp

Ans:取得生日的Gmt時間
<?
    $my_birthday = gmmktime(0,0,0,7,31,1995);
    print(date("M-d-Y",$my_birthday));
?>

Q:MySQL和PHP之間日期轉換
如果MySQL為datetime 那就取出時使用strtotime轉換成 UNIX Time
如果取出時就為int(11),也就是Unix time格式,這時就不用在轉換了,可以利用time()函式來讀取
#
# 得到目前系統 UNIX 時間
echo time();
# 下個禮拜時間

所以我們可以存放到 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);
$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"));

結論:
1.如果資料庫用int(11),就利用date(),mktime(),time()轉換成時間格式
2.如果資料庫用datetime,就利用strtotime()轉換成UNIX time來做日期相加減

Perl日期轉換
       
為了看個 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() 函式來取的。
01
02
03
04
05
06
07
08
09
       
#
# 得到目前系統 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() 函式
01
02
03
04
05
       
# 利用 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
01
02
03
04
       
#
# 將標準時間放入第一參數
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(Linux系統之一) 請找到 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);

資料參考:https://blog.wu-boy.com/2009/11/ … %E9%81%8B%E7%AE%97/
# 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);

日期處理:

方案1: 計算兩個日期間的 天數   
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";

方案2:
$NewDate = date('Y-m-d', strtotime($day . " +7 days"));
$NewDate = date('Y-m-d', strtotime('+7 days', strtotime($day)));

方案3:

$NewDate = date('Y-m-d', strtotime($day . " +7 days"));