Laravel 5.3 - Carbon日期 - 获取UTC偏移量的时区名称

4
我正在尝试使用Carbon在Laravel 5.3中从UTC偏移获取时区名称。以下是代码,任何帮助都将不胜感激。
/* current code iteration */
$utcOffset = -5;
$timezone = Carbon::now($utcOffset)->timezone->getName();
echo $timezone;
// Result: -05:00
// Expected Result: EST

/* tried code */
$timezone = Carbon::now($utcOffset)->tzName;
// Result: -05:00

/* What I used prior to Carbon */
$timezone = timezone_name_from_abbr(null, $utcOffset * 3600, TRUE);
$dateTime = new DateTime();
$dateTime->setTimeZone(new DateTimeZone($timezone));
$timezone = $dateTime->format('T');'

我错过了什么吗?我感觉很愚蠢。。
4个回答

5

前言:

大多数情况下,被接受的答案可以正常工作,但正如timezone_name_from_abbr()用户贡献笔记区所述,使用该函数存在问题,例如返回 false 而非实际时区以及返回给定位置的“历史”(即已弃用)时区标识符而非当前标准时区标识符。这些问题至今仍然存在。

此外,只要您知道根据 Carbon 文档,在https://carbon.nesbot.com/docs/#api-timezone查看:

时区的原始名称(可以是区域名称或偏移字符串):

这里还有一件事需要注意,那就是根据偏移值推导时区被认为不可靠,因为它没有考虑到观察期间的夏令时偏移。

因此,所有这些实际上都说明了从偏移量中推导时区并不总是可行的。

答案:

但由于 OP 提到了 Carbon 和基于偏移量的时区,根据 Carbon 文档现在的情况,答案应该是

$date = Carbon::now('-5');
echo $date->tzName;

4

尝试更新Carbon,但无果,最终使用旧的datetime类。

$timezone = timezone_name_from_abbr(null, $utcOffset * 3600, TRUE);
$dateTime = new DateTime();
$dateTime->setTimeZone(new DateTimeZone($timezone));
$timezone = $dateTime->format('T');

1
在新的Carbon中,有一个timezoneName属性;
$now = Carbon::now(-5);
echo $now->timezoneName;
//or 
echo $now->timezone->getName();

0
这对我很有效:
$now = Carbon::now(-5);

echo $now->timezone;
// prints 'America/Chicago'

2
根据git repo,它为$now->tzName - Vitalii Strimbanu
返回以下错误:无法将DateTimeZone类的对象转换为字符串。 - Colton Wagner
tzName 返回 -05:00 的偏移量。 - Colton Wagner
那我就无能为力了。根据文档,->tzName 应该是可以工作的,而且根据我的测试,它也确实可以工作。那么问题肯定出在其他地方。如果有帮助的话,我是在 Laravel 5.3 项目和 Carbon 版本 1.22.1 上进行测试的。 - DevK
嗯,我想它应该通过“composer update”自动更新。 - DevK
显示剩余2条评论

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