0

こんにちは、私はヨーロッパ/ベルリンのような特別なタイムゾーンを持っており、現在の日付に 90 日を追加したいと考えています。その後、月の最後の日を検出します。

データベース内の日付は UTC で保存されます。そのため、最後にタイムゾーンを変更する必要があります。

私の問題は、タイムゾーンの変更により、ヨーロッパ/ベルリンと UTC の間の時間から 2 時間が差し引かれることです。UTC に変更する前に日時オブジェクトを変更しないと、1 時間だけ差し引かれます。問題が何であるか、または正しい解決策を教えてもらえますか?

//$timezone = 'Europe/Berlin';
private function getMaxTillDate($timezone)
{        
    $threemonth = new \DateTime('now', new \DateTimeZone($timezone) );
    $threemonth->setTime(23, 59, 59);
    $threemonth->add(new \DateInterval('P0Y90DT0H0M'));
    $maxday = $threemonth->format('t');        
    $threemonth->setDate($threemonth->format('Y'), $threemonth->format('m'), $maxday);
    $threemonth->setTimezone(new \DateTimeZone('UTC'));

    return $threemonth;
}

どうもありがとうございました

4

1 に答える 1

0

私はあなたのコードをテストしました - それは私のために働きます:

function getMaxTillDate($timezone){
    $threemonth = new \DateTime('now', new \DateTimeZone($timezone) );
    var_dump(1, $threemonth);
    $threemonth->setTime(23, 59, 59);
    var_dump(2, $threemonth);
    $threemonth->add(new \DateInterval('P0Y90DT0H0M'));
    var_dump(3, $threemonth);
    $maxday = $threemonth->format('t');
    var_dump(4, $threemonth, $maxday);
    $threemonth->setDate($threemonth->format('Y'), $threemonth->format('m'), $maxday);
    var_dump(5, $threemonth);
    $threemonth->setTimezone(new \DateTimeZone('UTC'));
    var_dump(6, $threemonth);
    return $threemonth;
}

$tz = "Europe/Berlin";

var_dump(getMaxTillDate($tz));

結果:

int(1)
class DateTime#1 (3) {
public $date =>
string(19) "2013-01-15 22:29:59"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
int(2)
class DateTime#1 (3) {
public $date =>
string(19) "2013-01-15 23:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
int(3)
class DateTime#1 (3) {
public $date =>
string(19) "2013-04-15 23:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
int(4)
class DateTime#1 (3) {
public $date =>
string(19) "2013-04-15 23:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
string(2) "30"
int(5)
class DateTime#1 (3) {
public $date =>
string(19) "2013-04-30 23:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
int(6)
class DateTime#1 (3) {
public $date =>
string(19) "2013-04-30 21:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(3) "UTC"
}
class DateTime#1 (3) {
public $date =>
string(19) "2013-04-30 21:59:59"
public $timezone_type =>
int(3)
public $timezone =>
string(3) "UTC"
}
于 2013-01-15T21:32:17.397 に答える