检查时区是否有 DST
Check if timezone has DST
目前我正在尝试检测时区是否有夏令时,而不是夏令时是否影响时区。
目前我的代码如下所示:
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
return count($tz->getTransitions(time())) > 0;
}
$tz = new DateTimeZone('UTC');
$termin = new DateTime('2017-08-04 12:00:00',$tz);
$mytimezone=array();
foreach(timezone_abbreviations_list() as $abbr => $timezone){
foreach($timezone as $val){
if(isset($val['timezone_id'])){
$found = 0;
$tz2 = new DateTimeZone($val['timezone_id']);
$termin->setTimezone($tz2);
foreach($mytimezone as $mytz)
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
{
$found = 1;
if(timezoneDoesDST($val['timezone_id']))
{
$found = 0;
}
}
}
if($found == 0)
{
$mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id']);
}
}
}
}
foreach($mytimezone as $mytz)
{
echo $mytz['time'].' - '.$mytz['timezone_id'].'<br />';
}
问题是,我不会显示具有不同时间的所有不同时区和完全具有 DST 的时区。
但目前它会显示所有时区,如果我删除它:
if(timezoneDoesDST($val['timezone_id']))
{
$found = 0;
}
它只是显示不同时间的时区
谢谢
好的,如果有人需要的话,我已经稍微更新了我的代码以减少所选时区的数量:
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
return count($tz->getTransitions(time())) > 0;
}
$tz = new DateTimeZone('UTC');
$termin = new DateTime('2017-08-04 12:00:00',$tz);
$mytimezone=array();
$y = 0;
foreach(timezone_abbreviations_list() as $abbr => $timezone){
foreach($timezone as $val){
if(isset($val['timezone_id'])){
$y++;
$found = 0;
$found2 = 0;
$tz2 = new DateTimeZone($val['timezone_id']);
$termin->setTimezone($tz2);
foreach($mytimezone as $mytz)
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
{
$found = 1;
}
if(timezoneDoesDST($val['timezone_id']))
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s') and $mytz['timezone_id'] != $val['timezone_id'] and $mytz['DST'] == 0)
{
$found2 = 1;
$found = 0;
}
}
}
if($found == 0)
{
$mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id'],'DST' => $found2);
}
}
}
}
$mylist = count($mytimezone);
echo $mylist.' - '.$y.'<br /><br />';
foreach($mytimezone as $mytz)
{
echo $mytz['time'].' - '.$mytz['DST'].' - '.$mytz['timezone_id'].'<br />';
}
这将带和不带 DST 的不同时区从大约 1500 个减少到 68 个。
干杯,感谢大家。
这个解决方案怎么样?它根据实际时区生成 timezones/cities 的列表和从初始 $mytime
计算的时间,以及 DST 现在是否处于活动状态。我认为您不必为夏令时而烦恼(恕我直言,用户不关心,他想知道他所在时区的时间...)
$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
$mytz = new DateTimeZone('UTC');
$mytermin = new DateTime('2017-08-04 12:00:00',$mytz);
foreach($tzlist as $tzStr){
$tz = new DateTimeZone($tzStr);
$mytermin->setTimezone($tz);
echo $mytermin->format('Y-m-d H:i:s').' - '.$tzStr.'<br />';
}
目前我正在尝试检测时区是否有夏令时,而不是夏令时是否影响时区。
目前我的代码如下所示:
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
return count($tz->getTransitions(time())) > 0;
}
$tz = new DateTimeZone('UTC');
$termin = new DateTime('2017-08-04 12:00:00',$tz);
$mytimezone=array();
foreach(timezone_abbreviations_list() as $abbr => $timezone){
foreach($timezone as $val){
if(isset($val['timezone_id'])){
$found = 0;
$tz2 = new DateTimeZone($val['timezone_id']);
$termin->setTimezone($tz2);
foreach($mytimezone as $mytz)
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
{
$found = 1;
if(timezoneDoesDST($val['timezone_id']))
{
$found = 0;
}
}
}
if($found == 0)
{
$mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id']);
}
}
}
}
foreach($mytimezone as $mytz)
{
echo $mytz['time'].' - '.$mytz['timezone_id'].'<br />';
}
问题是,我不会显示具有不同时间的所有不同时区和完全具有 DST 的时区。
但目前它会显示所有时区,如果我删除它:
if(timezoneDoesDST($val['timezone_id']))
{
$found = 0;
}
它只是显示不同时间的时区
谢谢
好的,如果有人需要的话,我已经稍微更新了我的代码以减少所选时区的数量:
function timezoneDoesDST($tzId) {
$tz = new DateTimeZone($tzId);
return count($tz->getTransitions(time())) > 0;
}
$tz = new DateTimeZone('UTC');
$termin = new DateTime('2017-08-04 12:00:00',$tz);
$mytimezone=array();
$y = 0;
foreach(timezone_abbreviations_list() as $abbr => $timezone){
foreach($timezone as $val){
if(isset($val['timezone_id'])){
$y++;
$found = 0;
$found2 = 0;
$tz2 = new DateTimeZone($val['timezone_id']);
$termin->setTimezone($tz2);
foreach($mytimezone as $mytz)
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
{
$found = 1;
}
if(timezoneDoesDST($val['timezone_id']))
{
if($mytz['time'] == $termin->format('Y-m-d H:i:s') and $mytz['timezone_id'] != $val['timezone_id'] and $mytz['DST'] == 0)
{
$found2 = 1;
$found = 0;
}
}
}
if($found == 0)
{
$mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id'],'DST' => $found2);
}
}
}
}
$mylist = count($mytimezone);
echo $mylist.' - '.$y.'<br /><br />';
foreach($mytimezone as $mytz)
{
echo $mytz['time'].' - '.$mytz['DST'].' - '.$mytz['timezone_id'].'<br />';
}
这将带和不带 DST 的不同时区从大约 1500 个减少到 68 个。
干杯,感谢大家。
这个解决方案怎么样?它根据实际时区生成 timezones/cities 的列表和从初始 $mytime
计算的时间,以及 DST 现在是否处于活动状态。我认为您不必为夏令时而烦恼(恕我直言,用户不关心,他想知道他所在时区的时间...)
$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
$mytz = new DateTimeZone('UTC');
$mytermin = new DateTime('2017-08-04 12:00:00',$mytz);
foreach($tzlist as $tzStr){
$tz = new DateTimeZone($tzStr);
$mytermin->setTimezone($tz);
echo $mytermin->format('Y-m-d H:i:s').' - '.$tzStr.'<br />';
}