DateTime对象并在备用时区显示日期/时间

马迪瓦德

我已阅读的每个问题都涉及将DateTime对象从一个时区转换为另一个时区,并且过程通常是相同的:

$date->setTimezone($newTimezone);
$date->format($format);
$date->setTimezone($oldTimezone);

作为批处理过程,根据需要遍历前两个项目,date_default_timezone_set根据需要进行更改

我所拥有的是一个小部件,可显示多个时区的约会时间,而我发现我必须:

  • 创建多个DateTime对象,并在小部件中到达到期日期时更改每个对象,或者
  • 使用一个DateTime对象,但遍历所需的每个时区,将其主动更改为每个时区,显示,冲洗并重复。

我所试图做的是有一个DateTime对象集给用户时区,从来没有改变,但显示它相关的其它时区。我知道不立即支持此功能,但是如何最好地实现此目的呢?

我不喜欢管理多个DateTime对象,根本不需要它。我想要的是一种类似的方法:

DateTime::formatForTimezone($format, $timezone)

要么

DateTime::inTimezone($timezone)

然后我可以使用:

$date->inTimezone($timezone)->format($format)

并且$date的时区将保持不变。我可以迭代所需的时区,原始对象将被保留。

我确实编写了一个函数来实现此目的,但是我忘记了所有对象都是通过引用传递的,因此当我的函数返回时,对象时区已更改,我需要还原该时区,因此该函数产生了更多的工作(因此我将其废弃) 。但它看起来像:

function DateInTimezone(DateTime $date, DateTimeZone $tz, $format){
    $backup = $date->getTimezone();
    $date->setTimezone($tz);
    $output = $date->format($format);
    $date->setTimezone($backup);
    return $output;
}

我刚刚做了一个class extends基本相同,只是删除一个变量。

class DateTimeForTimezone extends DateTime {
    public function formatForTimezone($format, DateTimeZone $tz){
        $backup = $this->getTimezone();
        $this->setTimezone($tz);
        $output = $this->format($format);
        $this->setTimezone($backup);
        return $output;
    }
}

我是第一个承认的人,我不完全了解OOP,任何指针都将有所帮助

例如,这就是我的追求:

码:

echo '<pre>';

function p($arg){
    echo "$arg\n";
}
class DateTimeForTimezone extends DateTime {
    public function formatForTimezone($format, DateTimeZone $tz){
        $backup = $this->getTimezone();
        $this->setTimezone($tz);
        $output = $this->format($format);
        $this->setTimezone($backup);
        return $output;
    }
}
$f = "Y-m-d H:i:s A T O e";
$date = new DateTimeForTimezone('now',new DateTimeZone('UTC'));

$tzAUS = new DateTimeZone("Australia/Sydney");
$tzBKK = new DateTimeZone("Asia/Bangkok");
$tzLOS = new DateTimeZone("America/Los_Angeles");

// output ending with '*' should all be UTC
p($date->format($f."*"));
p($date->formatForTimezone($f,$tzLOS));
p($date->format($f."*"));
p($date->formatForTimezone($f,$tzAUS));
p($date->format($f."*"));
p($date->formatForTimezone($f,$tzBKK));
p($date->format($f."*"));

输出:

2017-09-29 23:37:20 PM UTC +0000 UTC*
2017-09-29 16:37:20 PM PDT -0700 America/Los_Angeles
2017-09-29 23:37:20 PM UTC +0000 UTC*
2017-09-30 09:37:20 AM AEST +1000 Australia/Sydney
2017-09-29 23:37:20 PM UTC +0000 UTC*
2017-09-30 06:37:20 AM +07 +0700 Asia/Bangkok
2017-09-29 23:37:20 PM UTC +0000 UTC*

我已经实现了我的目标,但是从技术上讲,时区更改,只是将其恢复原状。

我只是看错了吗?有没有更好的方法来实现我的追求?

主教

您做对了。区域不仅仅是显示,它还是时间状态不可或缺的一部分您无法使用时间值(例如“ 2017-05-13T21:54:00”)而不知道其时区。忘记计算,忘记比较,直到您知道区域。一分钟不要以为更改时区是微不足道的。众所周知,这很复杂因此,保持原样。

如果要在不管理对象的情况下循环执行此操作,请执行以下操作:

$date  = new DateTime('2017-05-13T21:54:00', new DateTimeZone('America/New_York'));
$zones = [
    new DateTimeZone('Antarctica/Casey'),
    new DateTimeZone('Europe/Helsinki'),
];
foreach ($zones as $zone) {
    echo (clone $date)->setTimezone($zone)->format('c') . PHP_EOL;
}

在3v4l.org上实时观看。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何显示日期时间,本地时间没有在最后的时区?

在UNIX时间戳Shell / Bash中使用时区转换日期

使用MomentJs显示日期时间而不进行时区转换

如何从日期时间对象中删除pytz时区?

如何从日期时间对象中删除pytz时区?

如何直接使用时区解析日期和时间

Python使用时区偏移量转换日期/时间字符串

比较时间戳并在iOS上使用时区

将时区格式的datetime转换为本地日期时间

访问日期时间对象的时区信息

如何在正确的时区为我显示时间和日期?

Swift:如何使用时区缩写解析日期和时间字符串?

熊猫:使用时区名称转换为日期时间

Django的显示日期时间不会根据用户的本地时区而改变

为什么这些日期时间对象的时区不相等?

使用时区将时间解析为日期时间

如何在Django中显示不同时区中的所有日期时间对象

如何在熊猫中使用时区将Unix纪元时间转换为日期时间

django:模板显示时区也为日期时间

使用时区将日期时间转换为UTC有时会无法正常工作

Rails表单在本地时区显示日期时间

关于按用户时区存储和显示日期和时间

日期时间加上期间显示不正确的时区

日期时间将时区显示为时间-Rails

使用时区将日期时间转换为 ISO 8601 日期时间格式

用时区解析日期

Python - 如何从日期时间对象中去除时区信息

如果在使用时区时包含时间,则日期返回不同的值

从 PHP 中的日期时间字符串显示默认时区