2013-03-28 16 views
9

私は2つのdatetimesの違いを取得しようとしているdatetimeとしてそれを返します。私はdiffを使用している例が見つかりましたが、私はそれを正しく得ることはできません。PHPは2つのdatetimesの違いを見つける

$timein = date("Y-m-d H:i:s"); 
$timeout = date("Y-m-d 20:00:00"); 
$totaltime = $timein->diff($timeout); 

ただし、$ totaltimeは「DB」に「0000-00-00 00:00:00」を記録します。これは私のtotaltime変数をフォーマットしていないためですか?

+0

date()は文字列を返します。文字列との相違を計算することはできません。 – Misch

答えて

35

は、私はあなたの差が探しているもののフォーマットはよく分からないが、ここであなたは、単に差を計算するために日時の差分とフォーマットを使用することができたDateTime

$datetime1 = new DateTime(); 
$datetime2 = new DateTime('2011-01-03 17:13:00'); 
$interval = $datetime1->diff($datetime2); 
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds'); 
echo $elapsed; 
+0

は "致命的なエラー:未定義のメソッドDateTime :: diff()"を呼び出します – Staleyr

+0

実行中のPHPのバージョンは何ですか? –

+0

5.4、in netbeans – Staleyr

1

使用してそれを行う方法です。

<?php 
$datetime1 = new DateTime('2009-10-11 12:12:00'); 
$datetime2 = new DateTime('2009-10-13 10:12:00'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%Y-%m-%d %H:%i:%s'); 
?> 

DATETIMEフォーマットの詳細については、参照してください。here
あなたは方法で間隔書式を変更することができ、あなたがしたいです。

Here

P.S.実施例でありますこれらの機能( diff()format()は)> = PHPで動作5.3.0のみ

+1

コードパッドのリンクが壊れています – pal4life

+0

Downvote。これは、OPによって要求されたフォーマットで結果を提供しません。 – mickmackusa

-1
<?php 
$val1 = '2014-04-10 11:34:09'; 
$val2 = '2015-04-10 10:56:15'; 
$result1 = (explode(' ', $val1)) ; 
$result2 = (explode(' ', $val2)) ; 
$date1= new DateTime($result1[0]); 
$date2=new DateTime($result2[0]); 
$diffdate=date_diff($date1,$date2); 
$difftime = strtotime($result1[1]) - strtotime($result2[1]); 
$dates=$diffdate->format("%R%a days"); 
echo $dates; 
echo $difftime; 
?> 
+0

このコードスニペットは問題を解決する可能性がありますが、コードのうち[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は、あなたの投稿の質。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – Rizier123

+0

datetimeの違いを見つけるコード –

+1

Downvote。この最近の回答は、現在受け入れられている回答よりも優れているわけではなく、答え自体には何の説明もありません。それは質問が求める結果を提供しません。これは低い資格の回答であり、編集または削除する必要があります。 – mickmackusa

-1
<?php 
$value='20140203113405'; 
$val='20150203113410'; 

$val1=str_split($val,2); 
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3]; 
$timeval1=$val1[4].":".$val1[5].":".$val1[6]; 

$val2=str_split($value,2); 
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3]; 
$timeval2=$val2[4].":".$val2[5].":".$val2[6]; 

$date1=new DateTime($dateval1); 
$date2=new DateTime($dateval2); 
$diffdate=date_diff($date1,$date2); 
$dates=$diffdate->format("%a days"); 
$difftime = strtotime($timeval1) - strtotime($timeval2); 
echo $dates; 
echo $difftime."seconds"; 
?> 
+2

このコードスニペットは問題を解決する可能性がありますが、コードのうち[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-base- answers)は、あなたの投稿の質。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – Rizier123

+0

iamはdatetimeの違いをこの形式で取得しようとしています –

+0

Downvote。この最近の回答は、現在受け入れられている回答よりも優れているわけではなく、答え自体には何の説明もありません。それは質問が求める結果を提供しません。これは低い資格の回答であり、編集または削除する必要があります。ページを複数の低品質の回答で捨てるのではなく、1つの回答(最高のもの)を投稿し、残りを削除します。 – mickmackusa

0

ジョン・コンデは、彼の方法ですべての右の手順を行いますがこれらには、あなたの質問の最後のステップを満たしていません結果をあなたの仕様にフォーマットしてください。

このコード(Demo)は、生の違いを表示し、すぐに生の違いをフォーマットしようとしているとのトラブルを露出させ、私の準備手順を表示し、最終的には正しい形式の結果を発表します:

$datetime1 = new DateTime('2017-04-26 18:13:06'); 
$datetime2 = new DateTime('2011-01-17 17:13:00'); // change the millenium to see output difference 
$diff = $datetime1->diff($datetime2); 

// this will get you very close, but it will not pad the digits to conform with your expected format 
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n"; 

// Notice the impact when you change $datetime2's millenium from '1' to '2' 
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n"; // only H does it right 

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s'])); 

echo '$detail array: '; 
var_export($details); 
echo "\n"; 

array_map(function($v,$k) 
    use(&$r) 
    { 
     $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT)); 
     if($k=='y' || $k=='m'){$r.="-";} 
     elseif($k=='d'){$r.=" ";} 
     elseif($k=='h' || $k=='i'){$r.=":";} 
    },$details,array_keys($details) 
); 
echo "Valid format: ",$r; // now all components of datetime are properly padded 

出力:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds 
Invalid format: 06-3-9 01:0:6 
$detail array: array (
    'y' => 6, 
    'm' => 3, 
    'd' => 9, 
    'h' => 1, 
    'i' => 0, 
    's' => 6, 
) 
Valid format: 0006-03-09 01:00:06 

私のdatetime値の準備を説明する:

$detailsは目を取りますe diff objectを配列としてキャストします。 array_flip(['y','m','d','h','i','s'])は、array_intersect_key()を使用して、無関係のキーをすべて(array)$diffから削除するために使用されるキーの配列を作成します。

そして$detailsarray_map()私の方法の反復を各値と鍵を使用して、0「Sと適切な長さに、その左側のパッドと$r(結果)要求された日時のフォーマットに適合するために必要な区切り文字列を連結します。

関連する問題