1

私はの線に沿って何かをしてきました。

$dt1 = '1000-01-01 00:00:00'; //really some val from db
$dt2 = '1000-01-01 00:00:10'; //another val maybe db maybe formatted

if(strtotime($dt1) > strtotime($dt2){
//do something
}

strtotimeは必要ですか?日時形式の文字列をより直接比較できますか?

すなわち

if($dt1 > $dt2){
//do something
}

それは常に機能しますか?

4

3 に答える 3

1

YYYY-MM-DD HH:MM:SS日付を文字列で形式を使用して保存している場合は、アルファベット順を使用できます。日付の順序と同じになります。

つまり、文字列の比較は、日付の比較と同じ結果になります。


UNIXタイムスタンプを使用しないことには利点があることを付け加えておきます。UNIXタイムスタンプは1970-01-01以降の秒数を表す32ビット整数に格納されるため、1970年から2038年までの範囲に制限されます(システムでは、範囲が広くなる可能性がありますが、無制限ではありません)

于 2010-03-16T20:19:16.850 に答える
1

はい、フォーマット内の文字列の辞書式順序yyyy-mm-dd hh:ii:ssは意図したとおりに機能します。そのような日付を並べ替えることもできます。

$dts = array(
  '1000-01-01 00:00:00',
  '2010-03-16 21:22:19',
  '1000-01-01 00:00:10',
  '1976-03-27 05:55:00', 
  '1976-03-27 05:54:00',
  '1968-08-21 12:00:00',
  '2001-01-01 00:00:01'
);

sort($dts);
foreach($dts as $dt) {
  echo $dt, "\n";
}

プリント

1000-01-01 00:00:00
1000-01-01 00:00:10
1968-08-21 12:00:00
1976-03-27 05:54:00
1976-03-27 05:55:00
2001-01-01 00:00:01
2010-03-16 21:22:19

ただし、正しい形式でない文字列についてはフィードバックが得られないことに注意してください。したがって、不正な形式の文字列がある可能性がある場合は、それも確認することをお勧めします。それが問題でない場合は、string1>string2で問題ありません。

編集:MySQLに作業を任せることもできます。これがphpでそれを行うのに良い/等しい/悪いかどうかは、実際に何を達成しようとしているかによって異なります。例えば

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// setting up a sample table with some values
$pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, d datetime NOT NULL, primary key(id))');
$pdo->exec("INSERT INTO foo (d) VALUES ('1000-01-01 00:00:00'),('2010-03-16 21:22:19'),('1000-01-01 00:00:10'),('1976-03-27 05:55:00')");


$query = "
  SELECT
    d,
    (d>'1910-03-17 12:00:00') as flag
  FROM
    foo
";

foreach ( $pdo->query($query) as $row ) {
  echo $row['flag'] ? '+ ':'- ', $row['d'], "\n";
}

プリント

- 1000-01-01 00:00:00
+ 2010-03-16 21:22:19
- 1000-01-01 00:00:10
+ 1976-03-27 05:55:00
于 2010-03-16T20:24:37.123 に答える
0

私は通常、タイムスタンプ値として日付を比較する際に安全を期すためにstrtotime()を使用します。

IFステートメントの両方を記述し、一方に「ステートメント1 true」を、もう一方に「ステートメント2true」を出力することで確認できます。次に、dt1とdt2の値を変更してみて、それがどのように機能するかを確認します。

于 2010-03-16T20:20:33.510 に答える