レシピ1.6 任意の日付からの経過日数

RubyクックブックをPHPに翻訳してみる。

レシピ1.6 任意の日付からの経過日数

特定の日付から何日が経過したか、あるいは未来の日付まであと何日残っているか知りたい。

特定の日付から何日が経過したか

<?php
//2007年1月1日から何日が経過したか
$t1 = mktime(0, 0, 0, 1, 1, 2007); //2007年1月1日のタイムスタンプ
$t2 = time(); //現在のタイムスタンプ
$one_day = 60 * 60 * 24; //1日の秒数
echo ($t2 - $t1) / $one_day; //2007年1月1日からの経過日数
// => 234.69549768519
?>

未来の日付まであと何日残っているか

<?php
//未来の日付まであと何日残っているか
$t1 = mktime(0, 0, 0, 1, 1, 2008); //2008年1月1日のタイムスタンプ
$t2 = time(); //現在のタイムスタンプ
$one_day = 60 * 60 * 24; //1日の秒数
echo ($t1 - $t2) / $one_day;
// => 130.30420138889
?>

カレントディレクトリとそのサブディレクトリから特定の文字を含むテキストファイルを検索するRubyスクリプト

Windowsのファイル検索は、文字コートがシフトJISに限定のようです。

シフトJIS以外の文字コード(euc-jpやutf-8)のファイルも検索したかったので、作成してみました。

カレントディレクトリとそのサブディレクトリから特定の文字を含むテキストファイルを検索します。

サンプルでは、ファイルの拡張子を「.php」に限定しています。
引数の文字列で検索します。

#!/usr/bin/ruby -Ks
require 'kconv'

keyword = ARGV.shift
Dir.glob("**/*.php") {|f|
  file = File.read(f).tosjis
  puts f if file.include?(keyword)
}

もっと早い方法がありますか?

レシピ1.5.日付の演算

RubyクックブックをPHPに翻訳してみる。

レシピ1.5.日付の演算

タイムスタンプに秒数を加減して計算する

<?php
//タイムスタンプに秒数を加減して計算する
//2008年9月1日の10日後を求める
$date = mktime(0, 0, 0, 9, 1, 2008); //2008年9月1日
$inc_day = 10; //10日後
$one_day = 60 * 60 * 24; //1日の秒数
print_r(date('Y年m月d日', $date + $inc_day * $one_day));
// => 2008年9月11日
?>

mktime()の引数を加減して求める。

<?php
//[mktime()][3]の引数を加減して求める。
//2008年9月1日の10日後を求める
$inc_day = 10; //10日後
$date = mktime(0, 0, 0, 9, 1 + $inc_day, 2008); //2008年9月1日
print_r(date('Y年m月d日', $date));
// => 2008年9月11日

//2008年9月1日の10日前を求める
$inc_day = -10; //10日前。負の数を指定する
$date = mktime(0, 0, 0, 9, 1 + $inc_day, 2008); //2008年9月1日
print_r(date('Y年m月d日', $date));
// => 2008年8月22日
?>

月末の日付を求める。
mktime()の日に「0」を指定すると、前月の月末の日付を取得できます。

<?php
$date = mktime(0, 0, 0, 9, 0, 2008); //2008年9月0日
print_r(date('Y年m月d日', $date));
// => 2008年8月31日
?>

2つの日付の間隔を求めるには、タイムスタンプの差から日数を計算します。

<?php
$from = mktime(0, 0, 0, 9, 1, 2008); //2008年9月1日
$to = mktime(0, 0, 0, 9, 11, 2008); //2008年9月1日
$one_day = 60 * 60 * 24; //1日の秒数
$period = ($to - $from) / $one_day;
print_r($period);
// => 10
?>

レシピ1.4.日付の反復

RubyクックブックをPHPに翻訳してみる。

レシピ1.4.日付の反復

mktimeはUNIXのタイムスタンプを返します。
このタイムスタンプは秒数を表しています。

<?php
///1999年12月31日から2000年1月10日までの繰り返し
$day = 60 * 60 * 24; //1日の秒数
$from = mktime(0, 0, 0, 12, 31, 1999);
$to = mktime(0, 0, 0,  1, 10, 2000);
for ($date = $from;
     $date <= $to;
     $date += $day) {
  print_r(date('Y/m/d', $date) . '<br />');
}
?>