3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Unix タイムスタンプを渡しDateTimeは作れる。が比較はUnix タイムスタンプ同士がよくないか

Last updated at Posted at 2018-03-01

ひとまず現在時刻との話。

まとめ

  • Unix タイムスタンプをそのままDateTime__constructに渡してもエラーとなる。
  • new DateTime('@' . time())と頭に@を付けると書式が認められDateTimeインスタンスが得られる。
  • ただし、new DateTime('@' . time())ではマシンのタイムゾーンが反映されず、第二引数にタイムゾーンを指定しても効かない。
  • インスタンスに対してタイムゾーンを指定する一手間が必要。
  • new DateTime()ではタイムゾーンは適応されている(ex:Asia/Tokyo)ので、タイムゾーンを意識しないと9時間ずれる。
  • PHPで時刻を取る関数の返り値はUnix タイムスタンプが多い1
  • 忘れやすいタイムゾーンを考慮するぐらいならば、もうUnix タイムスタンプを扱う必要が出た時点で無理にDateTimeに変換しなくてもいいのではないか

(PHPマニュアルの表記に倣いWikiでのUnix時間をUnix タイムスタンプと呼んでいます)


Unix タイムスタンプでDateTimeを作れなくていつも困るので見つけた記念にメモしようと思ったら、そもそもあまりよくなさそうという話。

参考

話としては参考記事で終わりだが、ではどうするのがいいのかと悩む。

検証環境

  • PHP 5.4
<?php

$tz = new DateTimeZone('Asia/Tokyo');

echo ((new DateTime())->format('Y-m-d H:i:s')) . "\n";
echo ((new DateTime('@' . time()))->format('Y-m-d H:i:s')) . "\n";
echo ((new DateTime('@' . time(), $tz))->format('Y-m-d H:i:s')) . "\n";
echo ((new DateTime('@' . time()))->setTimeZone($tz)->format('Y-m-d H:i:s')) . "\n";
2018-03-01 14:48:18
2018-03-01 05:48:18
2018-03-01 05:48:18
2018-03-01 14:48:18

file(a,m,c)time()はすべてUnix タイムスタンプで返すので、
ファイルがどれぐらい古いか=現在時刻との比較・差秒算出ならnew DateTime()よりtime()で計算したほうが心配がない。のでは。

(new DateTime('@' . time()))->setTimeZone(new DateTimeZone())
では理由がコードから読み取れず、似たことをするときに

  1. setTimeZone()をつけわすれる
  2. タイムゾーンは自動で合わせられるはずと勘違いして取り除くリファクタリング
  3. 第二引数でタイムゾーン指定できるのでこの書き方は冗長とリファクタリング

のどれかを自分なら踏み抜きそう。2

ただなんでもUnix タイムスタンプで処理しろというわけではなく、
文字列で日付が来たらstrtotime()よりDateTimeの方がいいと思っている。
あくまでどれか一つ、Unix タイムスタンプでしかとれない時刻が出てきたら、そっちに合わせたほうがいいんじゃないかなーという所感。


この経緯自体覚えることが難しそう…

  1. 印象です

  2. 自動テストしているなら大丈夫じゃないか

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?