2012-06-15 119 views
2

我有一个小片段,格式化日期这样的时间戳:(YYYY-MM-DD H:M:S T) Ex: 2011-09-29 17:00:46 EST or 2011-09-29 17:00:46 EDTPHP - 日期时间 - 显示时间ET而不是EST或EDT

我想转换EST和EDT对ET和显示ET相反,所以用户不用担心Dayligt的节省。我怎么做?

$timeZone = new DateTimeZone('America/New_York'); 
    $processedDate = str_replace(".000000", "", $timestamp); 
    $dateTime = new DateTime($processedDate, new DateTimeZone('GMT')); 
    $dateTime->setTimezone($timeZone); 
    $processedDate = $dateTime->format('Y-m-d H:i:s') . ' ' . $dateTime->format('T'); 
    echo processedDate; 

感谢

回答

9

,你想要做的事情是不实际的,并会导致用户恨你。

命名时区背后的全部原因是准确地表示当地时间。将当地时间作为当地时间的“标准”时间表示为DST内部客观上不正确。读取时间的时区内的任何人都将被误导。

如果您需要存储和处理忽略时区的日期和时间,请使用UTC作为此目的(即存储和常规数学)。值得记住的是,即使是旧的Unix时间戳也是“1970年1月1日午夜时分,UTC”。

如果您需要向用户表示本地时间,那么您应该允许他们选择他们的本地时区,并将其转换显示。现代PHP的DateTime和DateTimeZone使这个过程变得简单。从交互式提示:

php > $utc = new DateTimeZone('UTC'); 
php > $amla = new DateTimeZone('America/Los_Angeles'); 
php > 
php > $two_past_midnight = new DateTime('2011-04-05 00:02', $utc); 
php > $two_past_midnight->setTimeZone($amla); 
php > echo $two_past_midnight->format('Y-m-d H:i:s'); 
2011-04-04 17:02:00 

没有混乱,没有大惊小怪。我们在切换时区时考虑了数学。另外,如果你确实真的想要将DST时区变平,可以将getTransitions和getOffset与各种时区date()格式结合使用,尤其是我。您可以戳到产生的信息并找到何时下一个DST区域的“标准”版本转换并相应地进行调整。请记住,不同地区在不同时间过渡,并不是所有地区都以相同数量过渡......有些地区根本不会过渡。我想有人提到过印第安那。

通常我也会在这里提供示例代码,但是数学计算让我充满了对暴力的永不满足的渴望。无论谁决定60,60,24,7,4,6​​,12和52是可以接受的时间和日期思考方式,都是邪恶的邪恶的人。值得庆幸的是,他们都死了几百年和几千年。

1

没有名为ET的时区 - 它可以是EST (Eastern Standard Time)EDT (Eastern Daylight Time)。如果你想在没有夏令时的东部时间使用EST。