多语言侦测文章后,又遇到了时区的处理问题,每个人语言不同可能所在国家不同,时间也会不同,只显示一个固定时区的时间而不根据用户所在时区,可能会对用户体验造成一定影响。
当然,这里只是一个简单的示例,只是根据服务器的时区来做处理而不是用户真实的时区,如果需要根据用户则需要去获取用户 IP 所归属的国家(另外国外还有夏令时这些东东)。
修改下框架文件来支持:
vendor\topthink\think-orm\src\model\concern\TimeStamp.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
protected function formatDateTime($format, $time = 'now', bool $timestamp = false) { if (empty($time)) { return; }
if (false === $format) { return $time; } elseif (false !== strpos($format, '\\')) { $obj = new $format($time); if (method_exists($obj, '__toString')) { return $obj->__toString(); } }
if ($time instanceof DateTime) { $dateTime = $time; } elseif ($timestamp) { $dateTime = new DateTime(); $dateTime->setTimestamp((int) $time); } else { $dateTime = new DateTime($time); }
return $dateTime->format($format); }
|
app\util\AutoTimeZone.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?php declare (strict_types = 1);
namespace app\util;
use DateTime; use DateTimeZone;
class AutoTimeZone { protected $value;
public function __construct($value = null) { if(is_null($value)) { $value = gmdate('Y-m-d H:i:s'); } else { $date = new DateTime($value, new DateTimeZone('UTC')); $date->setTimezone(new DateTimeZone(date_default_timezone_get())); $value = $date->format('Y-m-d H:i:s'); }
$this->value = $value; }
public function __toString() { return $this->value; } }
|
config\database.php
1 2 3 4 5 6 7 8 9 10 11
| <?php
return [ 'auto_timestamp' => true,
'datetime_format' => '\\org\\util\\AutoTimeZone', ];
|