6

私はほとんどの時間をphpとmysqlまたはpgsqlで過ごしているので、日付APIの総称としてDateTimeを使用します。PHPには、「Date」、「Time」、「DateTime」、「DateTimeOffset」はありません。

Webアプリケーションを開発するにつれて、私はほとんどの場合DateTimeを使用しますが、それが本当に欲しいものなのかと思うこともあります。たとえば、今日の日付を表示したいだけの場合(たとえば、フォーラムやブログの投稿を保存したい場合)、計算も、提供するフィルターも、反復も発生しません...では、なぜ使用するのですか?機能\DateTimeを超えてdate()

各テクノロジーの長所を簡単に説明するこのトピックを見ました。

しかし、それは実際には質問に答えません。DATE_INTERVALAPI(phpではDateInterval)とIntlDateFormatterを使用できるため、PHPのDateTimeオブジェクトにさらに2バイト、データベースに他の2バイトをスローするのは本当に損失ですか?

さらに、この投稿では、unix_timestampは1970年から予約されていると述べています。しかし、それは論理的ではなく、いくつかのテストでそれが証明されています。

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

'31/12/1969'をエコーし​​ます!そしてそれは論理的です。32ビットのunsignedintは0から4 294 967 29568年で約20億秒しかないため、intは符号付きであり、「負のタイムスタンプ」が存在する必要があります。

もう1つ、これは私にとって非常に重要であり、毎回DateTimeを選択する理由は、整数ではなく日付を処理したいということです。DateTimeは日付ですが、タイムスタンプはそうではありません!私がタイムスタンプを見つけた唯一の意味は、ファイル名にタイムマークを付けたい時間でした。なぜなら、そのcasのタイムスタンプタイムスタンプであるからです...

ただし、それでも問題があります。タイムゾーンの処理です。MySQLなどは日付をDateTimeとして保存するときにタイムゾーンを処理しないため、今のところ、「フィルターインエスケープアウト」のエスケープ部分としてTimeZone統合を使用します

$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'));

それは正しい方法ですか?単純なタイムスタンプを保存してから、適切な現地時間を取得する方がよいのではないでしょうか。


だから、ここに質問の要約があります:

  • APIの本当に単純な使用(表示のみ)では、DateTimeのあと2バイトが失われますか?
  • unix_timestampをあきらめる時ですか?
  • 単純なタイムスタンプを保存してから、適切な現地時間を取得する方がよいのではないでしょうか。
4

2 に答える 2

4

コメントで述べたように、これは主に個人的な好みによるものだと思います。私の目には、Unixタイムスタンプと「レガシー」非OOPインターフェースの使用は、今日の世界でそれを行う方法ではありません。たとえば、でINTデータ型を使用することはありません(読むべきではありません)。日付をUnixTimestamp形式で格納するデータベースでは、代わりにデータベースのネイティブ型を使用する必要があります。これは通常、標準変換に関してはPHPのオブジェクト(および他の言語)とほぼネイティブに連携するDATEor型です。DATETIMEDateTime

標準変換の意味について少し詳しく説明します。MySQLを使用して値をPHPに戻すと、ISO形式の日付文字列が取得され、そのDateTimeクラスがコンストラクターで解析されて、すぐに使用できるオブジェクトが得られます。対照的に、Unixタイムスタンプルートを使用するにはstrtotime date使用してから、ネイティブで必要な形式に変換する必要があります。

PHPシステムと.NETシステム間の相互運用については前に説明しました。タイムスタンプを使用することによって引き起こされる特定の問題はありませんが、それは実際的な解決策ではありません。繰り返しになりますが、パイプを直接送信できるDateTime値を返すデータベースを使用します。これをPHPで内部的に使用するためにUNIXタイムスタンプに変換する場合、応答を送信する場合、または.NETアプリケーションに応答を送信する場合(またはAPIとだけ言う必要があります)、それを元に戻す必要があります。この場合)これはタイムスタンプであり、最後に変換します。全面的に使用DateTimeすることで、変換を行う必要がなくなり、開発プロセス全体が簡単になります。

最後に、これらすべてに加えて、投稿でも述べたように、犯罪のオブジェクト指向パートナーDateIntervalを使用する場合は、タイムゾーニング、操作、フォーマットなどの光沢のあるアイテムを使用できます。DateTimeそれは私の目にはより簡単な開発プロセスです。

これには「正しい」答えがあると最初に言ったので、私は信じていません。あなた自身のコーディングスタイルに基づく個人的な好みであり、上記のコメントは私のものを反映しています。

APIの本当に単純な使用(表示のみ)では、DateTimeのあと2バイトが失われますか?

  • 私は決してそうは思わない。特にPHPスクリプトは、一般的に、とにかく実行時間の短いプロセスです。

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

はい :)

単純なタイムスタンプを保存してから、適切な現地時間を取得する方がよいのではないでしょうか。

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

于 2012-09-27T11:21:22.643 に答える
1

あなたの質問に対する正確な答えではありませんが、値を処理するよりも、値を処理する方がはるかに費用効果が高い(CPUの処理時間を測定する)と信じているので、私は選択Timestampします。DateTimeIntegerDateTime

私は、またはを持っNumbersているのBinary Machineではなく、持っているときに非常に快適に感じます。StringsObjects

人間対機械

理解しやすさという点では、コンピューター用のプログラムを書いているときは、そのプログラムを作成していると思いますが、Machineそのレイヤーを抽象化することで、人間がそれを理解できるようになります。より良いのは、問題がないときにそれを使用しないのはなぜPerformanceですか?

誰が言ったのか、どこで聞いたのか思い出せませんが、誰かがのようなことを言ったPeople hate Computers, but they should hate Programmersので、私は完全に同意します。ですから、人間として、私は今でもそのマシンを尊重し、コンピューターにとってより理解しやすいプログラムを作ろうとしています。:)

アップデート:

よりよく描写するために、「日付」を処理するプログラムがあり、1分間に10,000回処理することを想像してみてください。

// 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

このコードを1週間に1時間見なければならないとしましょう。また、24時間年中無休で対応する必要のある人が10,000人いるとしましょう。もちろん、それを処理するつもりはありません。これは、マシーン。

ちなみに、Performanceそれが問題ではないのなら、なぜプログラマーにとって理解しやすいものにしないのでしょうか。それを最大限に活用する必要がある場合は、プログラマーにコードをWorksもっとよく見てもらいましょうLooks。:)

于 2012-09-27T10:04:52.713 に答える