PHP:如何从时区名称(例如America/New_York)获取时区值(例如东部标准时间)?

5

是否有任何PHP函数可以在时区名称(例如在此处找到的名称:http://php.net/manual/en/timezones.america.php)和“值”之间进行转换,例如Eastern Standard Time或Pacific Daylight Time?

不想在时区之间进行转换,只是想在给定美国/纽约(或其他)名称的情况下获取EST,PDT等名称。我找到的唯一类似的问题是针对另一种语言的。


为什么目的?用什么语言?请详细说明。 - Matt Johnson-Pint
为什么目的很重要?这是PHP编程语言相关的主题,因此标题、第一段和标签都与之相关。 - Bing
我的意思是,你是将它显示给用户看吗?用英文?还是将这个值传递到另一个 API 中? - Matt Johnson-Pint
啊,抱歉,我误解了。我正在使用一个文本转语音应用程序来传达事件的时间,包括它发生的时区。目前只支持英语,但您的答案似乎能够满足这个条件,谢谢。 - Bing
是的,那很有道理。您可以使用我下面提供的解决方案,并传递与您的TTS引擎匹配的语言区域代码。 - Matt Johnson-Pint
2个回答

5
如果您安装了PHP国际化包,则可以执行以下操作:
IntlTimeZone::createTimeZone('America/New_York')->getDisplayName()

默认情况下,这将返回 CLDR 的英文标准长格式,本例中为 "Eastern Standard Time"。您可以在 此处 找到其他可用选项。例如:

IntlTimeZone::createTimeZone('Europe/Paris')->getDisplayName(true, IntlTimeZone::DISPLAY_LONG, 'fr_FR')

上面的代码将返回"heure avancée d’Europe centrale",它是中欧夏令时的法语翻译。
请注意,如果在问题日期和时间处于夏令时状态,则将第一个参数传递为true,否则传递false。这可以通过以下技术来说明:
$tz = 'America/New_York';
$dt = new DateTime('2016-01-01 00:00:00', new DateTimeZone($tz));
$dst = $dt->format('I');
$text = IntlTimeZone::createTimeZone($tz)->getDisplayName($dst);
echo($text); // "Eastern Standard Time"

在此处查看可工作的PHP Fiddle

请注意,这些字符串旨在显示给最终用户。如果您的意图是将它们用于某些编程目的,例如调用另一个API,则它们不适用,即使一些字符串的英文版本恰好对齐。例如,如果您要将时区发送到Windows或.NET API或Ruby on Rails API,则这些字符串将无法使用。


4
如果您从列表 (http://php.net/manual/en/timezones.america.php) 中获取了值,则可以执行以下操作。
<?php

$dateTime = new DateTime();
$dateTime->setTimeZone(new DateTimeZone('America/New_York'));
echo $dateTime->format('T'); 

?>

1
这几乎是我所要求的,因为T提供了缩写,但没有完整的书写形式。我没有看到全名。 (此外,看起来这是在这里找到的,供任何人查看:http://php.net/manual/en/function.timezone-abbreviations-list.php) - Bing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接