2016-12-20 8 views
2

Я работаю над проектом, который поддерживает несколько стран, пока это европейские округа.PHP DateTime Manager по языку

Я держу дату в дате с часовым поясом UTC для всех стран. Когда я выбираю, я хочу показать соответствующее время для каждой страны. Например, если сохраненное время datetime [2016-12-20 07:00:00] UTC

Так что для Германии должно быть 2016-12-20 08:00:00 и для Великобритании должно быть 2016-12-20 07 : 00: 00

Таким образом, вместо проверки, в какой стране он

if($country === 'DE'){ 
    return (new DateTime($time))->setTimeZone(new DateTimeZone('Europe/Berlin')); 
}else if ($country === 'UK'){ 
return (new DateTime($time))->setTimeZone(new DateTimeZone('Europe/London')); 
} 

т.д.

Я думаю о создании диспетчера DateTime для управления установкой TimeZone.

я придумал следующее попробовать

<?php 

namespace App\Library\Values; 

use App\Library\System\Locale; 

final class DateTimeImmutableTimeZone extends \DateTimeImmutable 
{ 
    /** 
    * @var array 
    */ 
    private $timezones = [ 
     'GB' => 'Europe/London', 
     'DE' => 'Europe/Berlin', 
     'FR' => 'Europe/Paris', 
     'ES' => 'Europe/Madrid', 
     'IT' => 'Europe/Rome', 
     'SE' => 'Europe/Stockholm', 
     'NL' => 'Europe/Amsterdam', 
     'BE' => 'Europe/Brussels', 
     'DK' => 'Europe/Copenhagen', 
    ]; 

    /** 
    * @param Locale $locale 
    */ 
    public function __construct(Locale $locale) 
    { 
     $this->setTimezone(
      new \DateTimeZone($this->timezones[(string)$locale->country()]) 
     ); 
    } 
} 

Но когда я пытаюсь: var_dump (новый DateTime()); // Вывод:

DateTimeImmutable {#1673 
    +"date": "2016-12-20 07:00:00" 
    +"timezone_type": 3 
    +"timezone": "UTC" 
} 

var_dump (новый DateTimeImmutableTimeZone (новый Locale())); // Вывод:

DateTimeImmutable {#1673 
    +"date": "2016-12-20 07:00:00" 
    +"timezone_type": 3 
    +"timezone": "UTC" 
} 

Я не уверен, что это неправильно? Кроме того, я не уверен, что этот подход для записи имеет такой менеджер времени TimeZone

+0

Насколько я могу видеть из документов, в классе 'Local' нет функции' country() '. Является ли это (http://php.net/manual/de/class.locale.php) Local, которое вы используете, или это то, что вы написали самостоятельно? – cb0

+0

@ cb0 это псевдокод, представьте себе эту страну return DE – Dahab

ответ

0

Если вы просто хотите, чтобы класс, который заботится о создании разных объектов DateTime, в зависимости от кода страны, попробуйте это.

Это измененная версия вашего кода без использования классов immutable и Locale.

class DateTimeManager 
{ 
    /** 
    * @var array 
    */ 
    private $timezones = [ 
     'GB' => 'Europe/London', 
     'DE' => 'Europe/Berlin', 
     'FR' => 'Europe/Paris', 
     'ES' => 'Europe/Madrid', 
     'IT' => 'Europe/Rome', 
     'SE' => 'Europe/Stockholm', 
     'NL' => 'Europe/Amsterdam', 
     'BE' => 'Europe/Brussels', 
     'DK' => 'Europe/Copenhagen', 
    ]; 

    private $currentLocal; 

    /** 
    * @param string country 
    */ 
    public function __construct($country) 
    { 
     if(!in_array($country, array_keys($this->timezones))){ 
      throw new InvalidArgumentException(sprintf("Country %s not found.", $country)); 
     } 
     $this->currentLocal = $this->timezones[$country]; 
    } 

    /** 
    * Return a new DateTime object for the timestamp 
    * @param $time 
    * 
    * @return \DateTime 
    */ 
    public function getDateTime($time = null){ 
     return (new DateTime($time))->setTimezone(new DateTimeZone($this->currentLocal)); 
    } 
} 

Теперь результаты var_dump будет выглядеть следующим образом:

var_dump(new Datetime()); 
var_dump((new DateTimeManager("DE"))->getDateTime()); 
var_dump((new DateTimeManager("GB"))->getDateTime()); 

object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2016-12-20 17:42:03.860627" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Berlin" 
} 
object(DateTime)#2 (3) { 
    ["date"]=> 
    string(26) "2016-12-20 17:42:03.860854" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Berlin" 
} 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2016-12-20 16:42:03.861053" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/London" 
} 

Для вашего второго вопроса, это не так просто. Зависит от того, что именно вы хотите сделать с классом и в каком контексте он используется.

Неплохо было бы писать только строку из моей функции getDateTime каждый раз, когда вам нужно что-то вроде этого. Но в более крупной кодовой базе это может сделать вещи более легкими для вас.

+0

Мой вопрос: как я могу избавиться от getDateTime()? я хочу получить DateTime с предоставленным Locale, без необходимости вызова каких-либо других функций – Dahab

0

Я обращусь эта часть вашего вопроса:

... Я не уверен, если это подход записи, чтобы иметь такого TimeZone менеджер класс

Нет, это не правильный подход. Во многих странах имеется более одного часового пояса. Вы не можете выбрать часовой пояс из страны. Примеры: US, RU, AU, BR, MN много других.

Даже в указанном вами списке, ES (Испания) имеет два временных зоны. Europe/Madrid применяется на материке, и Atlantic/Canary применяется для Канарских островов. Они на один час.

Кроме того, часовой пояс и локаль являются двумя совершенно раздельными и несвязанными объектами. Языковой стандарт, такой как en-US, означает, что я хотел бы использовать английский язык с американским (США) диалектом и условностями. Это НЕ означает, что я нахожусь в Соединенных Штатах. Например, я вполне могу путешествовать и находиться в Японии.

 Смежные вопросы

  • Нет связанных вопросов^_^