ページ

2012/12/27

[PHP]年末年始に働きたくないPHPerのためのタイマー予約機能の実装

もう仕事納めをして16連休を謳歌している@wada811です。
皆さん年末年始をいかがお過ごしの予定でしょうか?
え?クリスマスや年越し・新年の対応のために仕事しているんです?
そんな仕事はタイマー仕込んでさっさと年末年始をまったり過ごしましょう!

DateTimeクラスやDateInterval::formatを使っていて
PHP5.3以上でないと動かないのでideone.comなどでは動作が確認できないので
codepad.viper-7.comで確認してください。
<?php
/**
 * タイマー処理用判定クラス
 */
class Timer {

   /**
    * タイマー処理: 指定の日時からはtrueを返す
    * @param string $dateTime 'Y-m-d H:i:s'フォーマットな日時
    * @return boolean 判定結果
    */
   public static function fromDateTime($dateTime){
       $today = new DateTime();
       $limitDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateTime, new DateTimeZone('Asia/Tokyo'));
       return $today->diff($limitDateTime)->format('%R') === '-';
   }

   /**
    * タイマー処理: 指定の日時まではtrueを返す
    * @param string $dateTime 'Y-m-d H:i:s'フォーマットな日時
    * @return boolean 判定結果
    */
   public static function toDateTime($dateTime){
       $today = new DateTime();
       $limitDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateTime, new DateTimeZone('Asia/Tokyo'));
       return $today->diff($limitDateTime)->format('%R') === '+';
   }

}
使い方は簡単!Timerクラスを require するなどしたら後は日時を渡して呼び出すだけ!
if(Timer::toDateTime('2012-12-25 23:59:59')){
    // クリスマスまでの処理
}
if(Timer::fromDateTime('2013-01-01 00:00:00')){
    // 来年からの処理
}
DateTime::diffに渡される日時が同じである場合は'+'を返すので
Timer::toDateTimeは境界を含みますが、Timer::fromDateTimeは境界を含みません。
まぁ1秒だけだから細かいことは気にしなくても大丈夫だと思いますので
普通に切りの良い時間をそれぞれ指定してもいいかと思います。