0

私のPHPアプリでは、PHPのdate()コマンドでフォーマットすると、MySQLデータベースから日付を取得します。私はそれを片付けて、検索ではなく、すべてをビューに移動したいと思います。しかし、私はいくつかの問題に遭遇しました。

データベースから日付を取得するときは、データベースで実行strtotime()した後、それをアプリの残りの部分に渡します。これにより、date()関数で操作できるものが得られます。これは良い考えですか?または私はより良いそして明白な何かを逃していますか?私が扱っている日付は、ほぼすべてDATEタイプであり、ではありませんDATETIME

だから、私は日付を取得し、date()それをWebページに表示するために使用できます。しかし、時々、データベースの他の場所に挿入するためだけにデータベースから何かを取得し、バックエンドを探し回ってdate()、ビューに分離するという目的を損なうような場所を見つける必要があります。私の検索関数は便利に戻りstrtotime($date_from_db)、次に他のテーブルに新しいエントリを作成します...そしてすべての新しいエントリは検証および準備関数を通過する必要があります。そしてここに問題があります。strtotime()日付が0000-00-00以外かどうかを確認して、日付を検証して準備します。しかしstrtotime()、タイムスタンプで実行することはできません。1969年12月31日を与えられた場合、私が実行したテストで。だから私の質問:

  1. strtotime()どういうわけかタイムスタンプで実行することは可能ですか?
  2. そうでない場合、変数がタイムスタンプであるかどうかを知る簡単な方法はありますか?だから私はdate()対処するのではなく、単にそれを実行することができstrtotime()ますか?1969年12月31日になるかどうかを確認することは別として、一貫性のない失敗を信頼できるかどうかわからないためです。それがとにかく有効なことでない限り?
  3. そして、私はこれを完全に間違っていますか?
4

4 に答える 4

1

タイムスタンプをクエリするときにmySQLに処理させます。

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

クエリは、必要に応じてフォーマットされたタイムスタンプを取得するため、文字列の処理を行う必要がありません。

于 2011-01-11T17:52:11.453 に答える
1

一般的なアプローチとして、私は非常に誘惑されます:

  1. MySQLの日時タイプを使用して日付/時刻値を格納します。これにより、> = "timestampvalueX"などを使用しなくても、MySQL内のデータを有意義にクエリできます。

  2. PHPスクリプト内をタイムスタンプ形式で使用して、すべての「ライブ」日付情報を保持します。

そのため、おそらく、すべての日付/時刻関連情報をその形式で目標として保存することを目指したいと思うでしょう。これを、PHPがクエリ自体で( UNIX_TIMESTAMPを使用して)使用できる形式に、またはYYYY-MM-DD HH:MM:SS形式を展開し、PHPのmktimeを使用して「標準」タイムスタンプを作成することにより、簡単に変換できます。(ただし、検証の目的でcheckdateを使用することもできます。)

特定の質問に戻ります。

  1. タイムスタンプが渡されると、strotimeは失敗します。

  2. 暫定的な手段として、提供された値が10桁の整数であるかどうかをチェックし、そうである場合はネイティブのタイムスタンプであると推定する関数を作成できます。(if(is_int($value) && strlen($value) == 10)...

  3. それは物事の音によって少し混乱しているので、かなり短期的な目標として、おそらくMySQLとPHPの両方で使用法を標準化することを試みるべきです。

于 2011-01-11T17:58:08.857 に答える
0

しかし、タイムスタンプでstrtotime()を実行することはできません。1969年12月31日を与えられた場合、私が実行したテストで。

1969年12月31日は、タイムゾーンがオフセットされたUNIXエポック1-1-1970の始まりです。

タイムスタンプで実行strtotime()すると0が返され、を実行すると1-1-1970UTCになりますdate()。結果strtotimeが0の場合は、それを行う必要があります。

于 2011-01-11T17:52:50.053 に答える
0

つまり、データベースから返されたタイムスタンプの前に「@」記号を付けると、通常のタイムスタンプと同じように使用できます。この解決策は、質問者が精通している手法やアプローチから可能な限り最小限に逸脱する手段として提案されています(最小限の労力/混乱のため)。

dbは文字列であるタイムスタンプのバージョンを返しますが、PHPタイムスタンプはタイムスタンプオブジェクトです。

'@'トリックを使用すると、一貫してコーディングできます。PHPからタイムスタンプオブジェクトを処理しているのか、MYSQLによって返される文字列を処理しているのかは関係ありません。

$ts1 = time();       //a PHP timestamp object
$ts2 = '1628100056'; //a string, like one coming back from a timestamp field in a MYSQL DB

//see here how they are both treated the same...
$date1 = date('Y-m-d',strtotime('@'.$ts1));
$date2 = date('Y-m-d',strtotime('@'.$ts2));

echo "from object: ".$date1;
echo "<BR>";
echo "from string: ".$date2;

DBからのタイムスタンプは、タイムスタンプフィールドから取得する必要があります。

SELECT UNIX_TIMESTAMP(my_timestamp_field) FROM my_table;
于 2021-08-04T18:18:21.347 に答える