我有一个小片段,用于格式化时间戳的日期,如下所示:(YYYY-MM-DD H:M:S T ) Ex: 2011-09-29 17:00:46 EST or 2011-09-29 17:00:46 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;
由于
答案 0 :(得分: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,6和52是可以接受的思考时间和日期的方式,都是邪恶的,邪恶的人。值得庆幸的是,他们已经死了几百到几千年。
答案 1 :(得分:1)
没有名为ET的时区 - 它是EST (Eastern Standard Time)
或EDT (Eastern Daylight Time)
。如果您想要东部时间没有夏令时,请使用EST。
答案 2 :(得分:0)
$date = str_replace(array('EST', 'EDT'), 'ET', $date);