2012-09-27 1 views
5

私はphpとmysqlまたはpgsqlでほとんどの時間を費やしていますので、Date APIの一般的な単語としてDateTimeを使用します。 phpには、 "Date"、 "Time"、 "DateTime"、 "DateTimeOffset"はありません。タイムスタンプよりDateTimeをいつ選択するのですか

Webアプリケーションを開発するにあたって、私はもっと丁寧にDateTimeを使いますが、私が望むもの たとえば、今日の日付を表示したいとき(フォーラムやブログの投稿を保存したいときなど)、計算はありません。フィルタは提供されず、繰り返しは発生しません。なぜ私はdate()機能より\DateTimeを使用しますか?

私はthis topicを見て、それぞれの技術の賛否両論を簡単に説明しています。

しかし、それは本当に質問に答えません。それは私がDATE_INTERVAL API(PHPでそれはDateInterval)とIntlDateFormatterを使用することができますので、PHPのDateTimeオブジェクトとデータベースの他の2バイトに2バイトを追加することは本当に損失ですか?

また、この記事はUNIX_TIMESTAMPは1970年から予約されている。しかし、それは論理的ではなく、いくつかのテストは、それを証明することを言う:

echo date('d/m/Y',time(-1)); 

エコー/ 1969' 分の12 '31!それは論理的です。 32ビットの符号なしintは0から4 294 967 295になり、68年で約20億分の1秒しかないので、intには符号が付けられ、 "negative timestamp"が存在しなければなりません!

もう1つは本当に大事なことだと思うので、毎回DateTimeを選択するようになりました。なぜなら、整数ではなく日付を扱いたいからです。 DateTimeは日付、タイムスタンプはありません!私がタイムスタンプを見つけた唯一の感覚は、そのcasタイムスタンプタイムスタンプ...

であるため、ファイル名のタイムマークを付ける時間でした。 のDateTimeとして日付を格納するときにMySQLと他の人がタイムゾーンに対応していないため、今のところ、私は「エスケープにフィルタアウト」のエスケープ一環として、タイムゾーンの統合を使用

$toStoreDate = new \DateTime($_POST['date'],new DateTimeZone('UTC')); 
$dao->exec('INSERT INTO mytable(mydate) VALUES (\''.$toStoreDate->format('Y-m-d h:i:s').'\')'); 
$toDisplayDate =new \DateTime($dao->query('SELECT mydate FROM mytable') 
    ->fetch(DAO::FETCH_ASSOC)['mydate']); 
$toDisplayDate->setTimeZone(new DateTimeZone('myLocal')); 

それが正しい方法ですか?シンプルなタイムスタンプを保存してからローカルタイムを取得する方が良いでしょうか?


だから、ここの質問のまとめたものです:

  • は日時の2つの以上のバイトは、APIの本当に簡単な使用(のみ表示)
  • の損失ですが、それは時間でありますunix_timestampをあきらめますか?
  • シンプルなタイムスタンプを保存してからローカルタイムを取得する方が良いでしょうか?
+0

おそらく無関係ですが、 'date()'は2038年までしか動作しません。その年、 'date()'はおそらく非推奨になります;-) –

+0

2038年の64ビットシステムでも標準ですか?もしそうでなければ、unixタイムスタンプ仕様をintからlong intに移行する際の問題は何ですか? – artragis

+0

確かに。 Javascriptは、1970年1月1日からミリ秒を使って時間を測定します。私の推測では、unixのタイムスタンプはここにあります^^ – Johan

答えて

3

私はこれが主に個人的な好みに基づいていると思います。私の目では、Unixのタイムスタンプと "従来の"非OOPインタフェースの使用は、今日の世界でそれを進める方法ではありません。たとえば、INTデータ型を使用していません。それは、標準の変換に来るときのUnixタイムスタンプ形式で日付を格納するために私達のデータベースでは、我々は代わりに、ほぼネイティブに通常PHPのDateTimeオブジェクト(および他の言語)と協力DATEまたはDATETIMEタイプであるデータベースのネイティブ型を使用する必要があります。

MySQLを使用してPHPに値を返すと、ISO形式の日付文字列が得られます。そのうちのDateTimeクラスは、すぐに使用可能なクラスを構文解析しますオブジェクト。対照的に、UNIXタイムスタンプのルートに行くには、strtotime、次にdateを使用して、ネイティブに必要なフォーマットにする必要があります。

私はPHPシステムと.NETシステムとの相互運用について前述しました。タイムスタンプを使用することによって特定の問題は発生しませんが、実用的な解決策ではありません。また、パイプをまっすぐに送信できるDateTime値を返すデータベースを使用します。これをPHPで内部的に使用するためのunixタイムスタンプに変換する場合は、応答を送信するか、.NETアプリケーションへの応答を送信する必要がある場合は、それを元に戻す必要があります(またはAPIこの場合はタイムスタンプ)、最後に変換します。ボード全体でDateTimeを使用することで、あらゆる変換が必要なくなり、開発プロセス全体が容易になります。

は、最後にまた、あなたの記事で述べたように、このすべてに追加するには、オブジェクト指向のパートナーをあなたはDateTimeを使用する場合などDateIntervalなど光沢のある項目、簡単にtimezoning、より簡単な操作と簡単にフォーマットなどを使用して取得し、それが関連しています犯罪で私の目では、これは簡単な開発プロセスです。

私は当初、これに「正しい」答えがあるとは思っていません。あなた自身のコーディングスタイルに基づいた個人的な好みのほうがはるかに多く、上記のコメントは私のものです。

のDateTimeの2つの以上のバイトは、私がどのような方法でそう信じていないAPIの本当に簡単な使用(のみ表示)

  • の損失です。特に、PHPスクリプトは一般的に、そのような短い実行プロセスです。

unix_timestampをあきらめるのは時間ですか?

はい:)

は単純なタイムスタンプを格納し、優れたローカルタイムを取得する方が良いと思いませんか?

上記のデータベースのコメントを参照してください。この目的のためにUnixタイムスタンプを使用するのは「ネイティブ」ではありません。 ->getTimezoneに電話してこれをデータベースに保存してから、再度取り戻すときに->setTimezoneを使用してください。

+0

私は非常にこの答えが好きです。あなたはある意味で私の視点に従います。 DateTime :: createFromFormatを使用すると、unixtimestampから日付を作成することができます(また、format( 'u')またはgetTimestampメソッドでDateTimeオブジェクトからunixtimestampを取得することもできます)。 – artragis

+0

もちろん。この問題は、PHPが単一の単純なタスクを実行するための100万の異なる方法を提供しているという事実にも起因していると私は思う。私の主なポイントは、 'DateTime'を使用していたことです。それは、元に戻ってくるISO形式の日付からインスタンスを直接構築するためのネイティブコンストラクタです。あなたはインスタンスから直接読み書きしています。これをタイムスタンプとしてMySQLから読み取るには、 'createFromFormat'を使用して、データベースに書き込むときにフォーマットする必要があります。不必要なオーバーヘッド、IMO。 –

1

ないあなたの質問に正確な答えが、私はInteger値に取り組んではDateTime値を処理むしろ、はるかにコスト(CPUの処理時間を測定する)が有効であると考えているので、私は、DateTimeオーバーTimestampを選ぶだろう。

NumbersBinary Machineに設定した場合は、StringsまたはObjectsと表示されます。 わかりやすさの面では機械

対人間

、私はコンピュータのプログラムを書いているとき、私はMachineが動作するためにすることを作っていることを検討すると言うだろうしかし、そのレイヤーを抽象化すれば、人間はそれをよりよく理解するのに役立つでしょう。Performanceは問題ではないのに、なぜそれを使わないのでしょうか?

私が言ったか、私がいることを聞いたところ、誰覚えることができない、誰かがPeople hate Computers, but they should hate Programmersのようなものを言って、私はそれに全く同意しています。だから人間として、私はまだそのマシンを尊重し、コンピュータにとってもっと理解できるプログラムを作ろうとします。 :)

アップデート:

は右、毎分1万回を、より良い、それを描く、我々が「日付」に対処するためのプログラムを持っている想像し、処理するには?レッツは、私は週に時間、このコードを見てきました、そして、彼らはその24時間365日の対処すべき万人がいるとしましょう。もちろん、私はつもりハンドルではありませんだと言う

// it LOOKS Better 
$date = new DateTime(); 
$date->setDate(1986, 3, 24); // March 24, 1986 
echo $date->format('Y-m-d'); 

// it WORKS Better 
echo date("Y-m-d", mktime(0, 0, 0, 3, 24, 1986)); // March 24, 1986 

それはマシンの仕事です。

ちなみに、私はPerformanceが問題でない場合は、なぜ私たちはプログラマのためのそれをより理解しやすくしていないことを改めて言うでしょうか?それを最大限に活用する必要がある場合は、Worksのコードをプログラマーに見せてください。Looksではありません! :)

+1

あなたの答えに感謝します。私は誰もが "コンピュータで理解できるもの"を書くことができるので、私は "人間が理解できるプログラムを書く"という視点を好むと言います。さらに、SQLクエリは文字列になるので、PHPスクリプトで日付を処理するたびに変換を意味します。また、PHPは非常に費用対効果の高い言語として知られていません(Javaや.NETでも同じです)。 – artragis

+0

@artragisねえ、私はあなたのコメントに関して答えを更新しました。 :) – Mahdi

+1

あなたの答えをupvotedがそれを受け入れていない。 私の問題は、日付、ピリオドなどを整数だけで処理するのは本当に*混乱していることです。整数だけの日付間隔を計算することは、ホイールを再発明していますが、読みやすさはあまりありません。 – artragis

関連する問題