の問題に頭を悩ませることはできませんDateTime()
。データベースで節約された時間と現在の時間の違いが必要です。ローカルマシンでは動作しますが、ライブサーバーでは動作しません。
これは私のフィールド定義です:
/**
* @ORM\Column(name="start_time", type="datetime", nullable=true)
*/
protected $startTime;
/**
* @ORM\Column(name="end_time", type="datetime", nullable=true)
*/
protected $endTime;
開始時間と終了時間を設定してから、差を計算することは常に機能します。
$diff = $entry->getEndTime()->diff($entry->getStartTime());
開始時刻のみが設定されている場合は、現在の時刻との差が必要なので、次のようにします。
$diff = (new \DateTime())->diff($entry->getStartTime());
しかし、これは機能しません。違いは2時間から低いです。
開始時間と終了時間は、次のようなフォーム入力で設定されます。
// user inputs for example: 08:50 for $start and 17:45 for $end
$dateStr = date('Y-m-d');
$entry->setStartTime(new \DateTime($dateStr.' '.$start));
$entry->setEndTime(new \DateTime($dateStr.' '.$end));
UTCではなくヨーロッパ/ベルリンのタイムゾーンを使用することで2時間の休暇が発生すると推測していますが、これに対応するにはどうすればよいですか?
交換new \DateTime()
するnew \DateTime('now', new \DateTimeZone('Europe/Berlin'))
かnew \DateTime('now', new \DateTimeZone('UTC'))
、効果はありません。
助けてくれてありがとう。
要求に応じて編集
$currentDate = new \DateTime();
$currentDate->modify($currentDate->getOffset() . ' seconds');
// var_dump($entry->getStartTime())
object(DateTime)#358 (3) {
["date"]=> string(19) "2014-06-29 09:20:00"
["timezone_type"]=> int(3)
["timezone"]=> string(3) "UTC"
}
// var_dump($currentDate)
object(DateTime)#337 (3) {
["date"]=> string(19) "2014-06-29 06:50:00"
["timezone_type"]=> int(3)
["timezone"]=> string(3) "UTC"
}
// local time: 11:20:00
// difference should be: 2:30 but is 0:30
ベルリンのユーザーが12:00を入力すると(12:00ヨーロッパ/ベルリンが念頭にあります-UTC時間の10:00)、Doctrineはタイムゾーンなしで日付(12:00)を保存します。
DateTimeフィールドを取得すると、Doctrineによって12:00ベルリンではなく12:00 UTC(デフォルトのアプリケーションtimeZone)として再作成されます。
したがって、ユーザーが提供した日付をシステムが提供した日付と比較するには、ユーザーのタイムゾーンを保存する必要があります。Doctrineのドキュメントを参照してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加