根据PST日期生成UTC的开始和结束日期时间

时间:2011-08-15 09:16:02

标签: php

我正在接收一个参数,该参数是PST时区中的日期,其格式为“YYYY-MM-DD”(例如“2011-08-15”)。此参数是可选的。我有2个问题,我一直在努力。

我需要计算此日期 UTC 的开始和结束日期时间。

因此,如果输入的日期是2011-08-15,我想获得开始和结束日期时间:

2011-08-15 07:00:00

2011-08-15 06:59:59

(这些基本上是一天的开始和结束)

其次,是处理未传入日期的情况。我想默认为当前的PST日期,并从那里开始。因此,如果当前日期时间为2011-08-01 10:00:00,我希望获得与第一个方案相同的开始和结束日期时间,除非它基于输入的日期。

2011-08-01 07:00:00

2011-08-01 06:59:59

我一直在处理日期和日期转换问题。我确定我错过了一些非常简单的东西。

2 个答案:

答案 0 :(得分:3)

解析日期并假设PST时区:

$date = new DateTime("2011-08-15", new DateTimeZone("PST"));

将时区更改为UTC :(这会为您完成所有转换)

$date->setTimeZone(new DateTimeZone("UTC"));

计算开始和结束。开始是我们的$ date,结束是$ date + 1天

$start = $date;
$end = clone $date;
$end->modify("+1 day"); // now $end is $start + 1 day

打印开始/结束:

printf("start: %s, end: %s\n", $start->format('Y-m-d H:i:s'), $end->format('Y-m-d Hi:s'));

// this prints start: 2011-08-15 07:00:00, end: 2011-08-16 07:00:00

对于问题的最后部分,您可以轻松地比较两个日期:

if ($date > new DateTime()) { // if $date is after now
     // do something
}

所以你可以这样做:

if ($date > new DateTime()) { 
    $date->setTimeZone(new DateTimeZone("UTC"));
}

如果你不太喜欢OO语法,你也可以使用函数别名:

$date = date_create(...);
date_format($date, ...);
date_modify($date, ...);
// ...

答案 1 :(得分:-1)

使用setTimezone功能

工作示例(我不在PST时区,所以我必须明确设置它)

$date_input = "20011-09-15";
//$date_input = null; //That will emulate no-input case
date_default_timezone_set("America/Los_Angeles"); //if you are in PST, you don't need this line
$date_start = new DateTime($date_input);
$date_end = new DateTime($date_input);
$date_end->modify("+1 day"); 

/*$date_start->setTimezone(new DateTimeZone("America/Los_Angeles"));
$date_end->setTimezone(new DateTimeZone("America/Los_Angeles"));*/

//end of date is equal to start of the next day.
//But, if you need something like 2011-08-11 23:59:59 add $date_end->modify('-1 second')
$date_start->setTime(0,0,0);
$date_end->setTime(0,0,0);

echo "Date Start PST:".$date_start->format("Y-m-d H:i:s")."<br/>";
echo "Date End PST:".$date_end->format("Y-m-d H:i:s")."<br/>";

//UTC is equal to London time. Almost :)
$date_start->setTimezone(new DateTimeZone ('Europe/London'));
$date_end->setTimezone(new DateTimeZone ('Europe/London'));

echo "Date Start UTC:".$date_start->format("Y-m-d H:i:s")."<br/>";
echo "Date End UTC:".$date_end->format("Y-m-d H:i:s")."<br/>";