PHP」タグアーカイブ

PHP 時間の差分を求める

日付を除外して時間のみを求める方法がなかったのでまとめ

<?php

$from_h = '8'; // 08でも可
$from_m = '10';
$to_h = '17';
$to_m = '00';

echo sectostr(strtosec($to_h, $to_m) - strtosec($from_h, $from_m));
// 08:50と表示されます

function sectostr($val) {
    return sprintf("%02d:%02d", $val / 3600, ($val % 3600) / 60);
}

function strtosec($h, $m) {
    return $h * 3600 + $m * 60;
}

時間と分を秒に直して差分を出しています。
秒に直すのでstrtotimeやnew DateTimeにて比較しなくてもいいです。
strtotimeとnew DateTimeは日付ありきでの比較になるので時間のみの差分を出すときややこしいです。
下記一例

<?php

echo date('Y/m/d H:i', strtotime('17:00') - strtotime('8:10'));
// 1970/01/01 09:50と表示

strtotimeだと日付の引き算がされ時間のみの差分が出せません。
強引にやるならこう

<?php

echo date('Y/m/d H:i', strtotime('17:00') - strtotime('8:10') + strtotime(date('Y/m/d')));
// 2021/08/14 08:50と表示

引き算された日付を最後に足して日付のつじつまを合わせていますが、このコードは休憩時間を除いたりするときに日付のことを常に考えなくてはならずややこしすぎて使えません。

PHP wkhtmltopdf SnappyでPDF出力

今までTCPDTやmPDFを使ってたのですがHTML5 + CSS3のWebページを丸ごとPDF化する必要がありレイアウトのズレが実装できるレベルじゃなかったのでwkhtmltopdf Snappyを調べました。

環境
Windows10
XAMPP
PHP7.3

require "knp-snappy/vendor/autoload.php";
use Knp\Snappy\Pdf;
$snappy = new Pdf('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"');
// $snappy->setBinary('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"')
$html = <<<EOF
<style></style>
<p>ここにHTMLを書く</p>
EOF;
// PDFをブラウザに出力
//header("Content-Type: application/pdf");
//echo $snappy->getOutputFromHtml($html);
// 保存
$snappy->generateFromHtml($html, 'download.pdf');

はまった点

setBinaryなどでバイナリのパスを渡すときはコマンド扱いになるのでダブルクォーテーションで囲むのを忘れていてはまりました。