2011-02-01 18 views
1

PHPのDateTimeクラスには、DateTimeオブジェクトからタイムスパンを加算または減算するadd()およびsub()の2つのメソッドがあります。これは私にはとてもよく似ていますが、.NETでも同じことができます。しかし、一度試してみると、それは非常に奇妙なことをしました。私はPHPで、それらのメソッドはオブジェクト自体を変更することがわかった。これは文書化されておらず、戻り値の型はそれ以外の場合を示します。さて、いくつかのシナリオでは、1つではなく3行のコードと、追加のローカル変数が必要です。しかし、PHP5のリファレンスモデルによる複製も機能します。オブジェクトをコピーするだけでは不十分です。元のインスタンスを誤って変更しないように、オブジェクトを明示的に複製する必要があります。そこでここではC#のコードは次のとおりです。.NET開発者のPHP DateTime

DateTime today = DateTime.Today; 
... 
if (date < today.Add(TimeSpan.FromDays(7)) ... 

ここではPHPと同等です:

$today = new DateTime('today'); 
... 
$then = clone $today; 
$then->add(new DateInterval('P7D')); 
if ($date < $then) ... 

(私は、メソッドの実行時にすべての計算のために同じ時間を持つように、今日のコピーを保存し、私はそれを見てきました。多くの場合、秒単位またはそれ以上の時間単位が変更されます。)

これはPHPですか?より良い解決策がない場合は、そのためのラッパークラスを作成する必要があります!または、私はちょうどよいol 'time()関数を使い、データベースから取得するISO日付の解析を簡単にするためにDateTimeを使用します。

$today = time() % 86400; 
... 
if ($date < $today + 7 * 86400) ... 

これらの例ではタイムゾーンは考慮されていません。

更新:私は、このような日付の解析にstrtotime()関数を使用できることを知りました。それで、PHPのDateTimeクラスの使用はどうしたらいいですか?使用するのがとても複雑なのですか?

更新^ 2:今日の私の$ =がゴミであることに気付きました。さて、「今日」の代わりに正しい方法を想像してみてください。

+1

「これは記載されていません」.... DateTime :: add - DateTimeオブジェクトに日、月、年、時、分、秒を追加します。 –

+0

はい、時間を追加して返します新しい価値 - これは私の理解です。それを明確にするものはほかにありません。インスタンスを変更することは全く実用的ではありません。特にそれを避けるような努力が必要な場合。 – ygoe

+1

これは、メソッドチェーンのDateTimeオブジェクトを返します。それはそれがオリジナルのオブジェクトであることを意味します。しかし、時にはあまり実用的ではない –

答えて

2

あなたは間違いなくオブジェクトのクローンを作成する必要があります。他の方法でDateTimeオブジェクトのコピーを作成する方法はありません。私は、これは完璧ではないに同意

$today = new DateTime('today'); 
... 
$then = clone $today; 
if ($then->add(new DateInterval('P7D')) < $then) ... 

私の知る限り見ることができるように、あなたは一行を救うことができます。それにもかかわらず、DateTimeに固執してください。必要に応じてヘルパークラスを作成してください。 の方法は、古い日付関数よりも優れています.2038年のバグはなく、タイムゾーンの扱いが非常に簡単です。

+2

オリジナルを変更するのではなく、修正されたコピーを返すDateTimeの考え方は、実際には.NETの奇妙なものです。他の言語では、ほとんどの場合、値を加算または減算することになりますオリジナル。オリジナルを変更する必要があり、コピーを変更する必要が生じることがあります。 – Broam

+0

さて、ほとんどの場合、DateTimeの修正版を入手するのは本当に現実的でした。また、オリジナルを変更する必要がある場合は、結果を同じ変数に割り当てることができます。 .NETでは、DateTimeはクラスではなく構造体なので、値によってコピーされて明示的なクローン操作を省くことができます。 – ygoe

関連する問題