2009-06-30 13 views
2

私はいくつかの非常に基本的な時間の計算をしようとしています - 基本的に、時間と距離の入力を与え、速度を計算します。私は時間入力を秒に変換するためにstrtotime()を使用することを選択しました - しかし、私はいくつかの奇妙な結果を得ています。私はこれらの結果を得るのはなぜPHP時間計算の奇妙な振る舞い:strtotime()が負の数を返すのはなぜですか?

<?php 
$t1 = strtotime("3:15:00",0); 
$t2 = strtotime("1:00:00",0); 
$t3 = strtotime("2:00:00",0); 
$t4 = strtotime("9:00:00",0); 

echo $t1 . "\n"; 
echo $t2 . "\n"; 
echo $t3 . "\n"; 
echo $t4 . "\n"; 
?> 

:たとえば、このサンプル・プログラムを

を与えられましたか?

$ php test.php 
-56700 
-64800 
-61200 
-36000 

更新:

誰が明示的にそれを言わなかったので、私は上記の機能のバグを説明しましょう。私はstrtotime()に0の時間を渡すと、1969年12月31日の深夜から派生したタイムスタンプを生成することになると思っていました。これは奇妙に思えますが、私の目的のために働くでしょう。

私が数えなかったことは、文字列を変換するときにstrtotime()がタイムゾーンを考慮に入れ、サーバーがUTCより5時間遅れていることです。その上、時間帯のシフトのために、PHPはの時代の前の日であるを解釈します。つまり、12月30th,1969,1919の代わりに発生したと解釈されます。負の数で...

ユージンは正しいと思われます。私が経過時間だけを計算したいのであれば、組み込みの時間関数は使用できません。私はこの実行したとき

+0

「私はただの経過時間を計算したい場合は、私が使用することはできません組み込みの時間関数です。 - いいえ、できます。strtotime()の2番目のパラメータを省略してください。指定した時刻の今日のタイムスタンプを取得します。タイムゾーンは重要ではありません。 2番目のパラメータとして0を指定するだけで、大文字小文字の問題が発生します。 – deceze

+0

それは意味をなさない。 もう一度 - 私は絶対的な時間を欲しくない、私は秒にユーザー入力文字列を変換する必要があります。あなたのソリューションがうまくいく唯一の方法は、strtotime( "user string"、time()) - strtotime( "midnight"、time())のようなことです。 –

+0

だから? strtotime()で文字列を秒に変換していますが、1970年以降のすべての秒も追加されています。しかし、それらのタイムスタンプの間だけで相対的な計算をしているのであれば、それは問題ではありません。 0,900,1345または1246399668,1246400568,1246401013-両方とも同じ相対的関係である。 – deceze

答えて

5

あなたがそのような何かをしたい場合は、私はあなただけの時間文字列に自分自身をいくつかの数学を行うと、それらを変換したいと思いますこのような秒数、:

<?php 
function hmstotime($hms) 
{ 
    list($hours, $minutes, $seconds) = explode(":",$hms); 
    return $hours * 60 * 60 + $minutes * 60 + $seconds; 
} 
?> 
+0

他の回答を見ると、それが唯一のアプローチかもしれません。 –

+0

これをやっていることを考えると、おそらくあなたが探しているものです(スピードとそのようなものを計算する)。それが可能なら、あなたがしたいことをやるためにもう少し複雑な作業が必要です。私は試していません。 –

2

はどうやらとPHPは、日付を割り当てているだけで裸回12月31日、1969年には:

echo date('F j, Y H:i:s', $t1) . "\n"; 
echo date('F j, Y H:i:s', $t2) . "\n"; 
echo date('F j, Y H:i:s', $t3) . "\n"; 
echo date('F j, Y H:i:s', $t4) . "\n"; 

を私はこれを得た:

 
December 31, 1969 03:15:00 
December 31, 1969 01:00:00 
December 31, 1969 02:00:00 
December 31, 1969 09:00:00 

は、strtotimeは、UNIXタイムスタンプを返すことに注意してくださいこれは1970年1月1日からの秒数で定義されています。UNIXタイムスタンプは特定の月/日/年を意味します。strtotimeという名前は実際には日付のない裸の時間ではありません。

+0

その後、裸の時間を経過秒に変換するにはどうすればよいですか? –

0

2番目のパラメータを付けずに試してください。これは返された時間の相対的なタイムスタンプであるはずです。 0を指定すると、Unixエポックに関連するタイムスタンプを要求していることを意味します。

あなたのコメントへの返信

それは、機能性を文書化していないが、私はすべての時間strtotime("HH:MM")を使用し、それが現在の時刻にタイムスタンプを相対返します。私はあなたがが確認したい場合は、あなたがこれを行うことができると思います:

strtotime("3:15:00",time()); 
+0

それは私に1969年から現在までの秒数に加えて与えられた時間を加えてもらえませんか? 私が欲しいのは、提供された時間を秒に変換することです。 –

+0

あなたのコメントに答えるために私の答えを更新しました。 –

+0

それでも、文字列を秒単位に変換するのではなく、エポックに相対的な時間を与えてくれます。 –

1

のstrtotime()は二番目の引数に対する秒数(あなたのケースでは、Unixエポック(1969年12月31日19時00分〇​​〇秒))を出力しますので。

"3:15:00"はUnixエポック前の56700秒であるため、負の数値が必要です。第二引数なし

+0

エポックが始まる前にどのようにして陽性の時間が起こりますか?これはタイムゾーンのことですか? –

1

strtotime()が供給された文字列から時刻を取得し、現在の日付からの空白を埋める:

echo date('Y-m-d H:i:s', strtotime("3:15:00")); 
-> 2009-06-30 03:15:00 

、第2引数に相対日付を算出する第二引数と

echo date('Y-m-d H:i:s', strtotime("3:15:00", 0)); 
-> 1970-01-01 03:15:00 
は秒で2つのタイムスタンプの差分を計算するには、ちょうどこの操作を行うことができます。

echo strtotime("3:15:00") - strtotime("3:00:00"); 
-> 900 

編集:もちろん、大きな数である考慮に入れて:

$t1 = strtotime("3:15:00"); 
$t2 = strtotime("3:30:00"); 

$diff = max($t1, $t2) - min($t1, $t2); 
$diff = abs($t1 - $t2); 

か、その自然の何か...