@artem78

Установка часового пояса в пределах модуля?

Можно ли в php установить часовой пояс по умолчанию только в пределах одного файла или класса?

Дело в том, что у меня есть некоторый модуль производящий рассчёты с учётом времени пользователя. Использовать date_default_timezone_set() не могу, так как это приведёт к некорректной работе остального кода. А в модуле при создании DateTime объекта (которое происходит в десятке различных мест) каждый раз устанавливать ему зону не очень удобно. К тому же, учитывая что модуль использует в своей работе несколько сторонних классов, придётся переделывать их и реализовывать передачу зоны от использующего их класса. Очевидно, что это не самое правильное решение.

Подскажите, как лучше сделать в такой ситуации.
  • Вопрос задан
  • 239 просмотров
Пригласить эксперта
Ответы на вопрос 1
SWEBB
@SWEBB
Software Developer
Все это делается на уровне приложения. Это архитектурная проблема..
1. У вас в каждом модуле должен быть конфиг или место откуда вы будет забирать часовой пояс
Например
src/modules/user
                           - timezone.ini 
src/modules/customers
                           - timezone.ini 
src/modules/admin
                           - timezone.ini


2. У Вас должна быть точка входа в модуль, которая обращается ко всем внутренностям компонента.
Например, если модули не вызываются напрямую, а используются для взаимодействия во всей системе... то я сделал бы Dependency Injection Container
src/modules/user/
                           - DIC.php
                           - ...
                           - UserController.php
                           - timezone.ini
src/
    - TimeZone.php

# timezone.ini
timezone=Europe/Kiev

# TimeZone.php
class TimeZone() {
    
    private $tz;
    
    public __constructor($tz) {
    	$this->tz = $tz;
	}

    public function getDateTime() {
        $currentDate = (new \DateTime())->format('Y-m-d H:i:s');
		$tz = new DateTimeZone($config['timezone']);
		$date = new DateTime($currentDate);
		$date->setTimezone($this->tz);
		return $date;
    }
}

# DIC.php

use src/TimeZone;
use UserController;

class DIC {
	
	private function getTimeZone() {
	    $config = parse_ini_file('timezone.ini');
		retrun new TimeZone($config['timezone']);
	}

	public function getUserModule() {
		return new UserController(
			($this->getTimeZone()->getDateTime())
		)
	}
}

# UserController.php
class UserController {
	
	protected $date;

	public function __constructor(\DateTime $date) {
		$this->date = $date // Можно расшарить между внутренними компонентами модуля
	}
}

3. Как использовать?
# У каждого компонента параметр со своей временной меткой
$dic = new DIC();
$userModule = $dic->getUserModule();
$customerModule = $dic->getCustomerModule();
$adminModule = $dic->getAdminModule();

# PS. Подразумевается что UserController управляет сервисами содуля.. одним словом - настоящий контроллер)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы