9.3.3 – TimeHelper
Há dias que você tem que ir para a frente só com o que você tem na mão, não dá para esperar pela motivação.
Data e Hora com CakePHP 3
class Cake\I18n\Time
Se você precisa das funcionalidades do TimeHelper fora de uma View, então use a classe Time:
use Cake\I18n\Time;
class UsersController extends AppController
{
public function initialize()
{
parent::initialize();
$this->loadComponent('Auth');
}
public function afterLogin()
{
$time = new Time($this->Auth->user('date_of_birth'));
if ($time->isToday()) {
// Greet user with a happy birthday message
$this->Flash->success(__('Happy birthday to you...'));
}
}
}
Criando Instâncias de Time
Existem algumas maneiras de criar instâncias de Time:
use Cake\I18n\Time;
// Create from a string datetime.
$time = Time::createFromFormat(
'Y-m-d H:i:s',
$datetime,
'America/Fortaleza'
);
// Create from a timestamp
$time = Time::createFromTimestamp($ts);
// Get the current time.
$time = Time::now();
$time = new Time('2014-01-10 11:11', 'America/Fortaleza');
$time = new Time('2 hours ago');
Mais:
$now = new Time('2014-04-12 12:22:30');
Time::setTestNow($now);
// Retorna '2014-04-12 12:22:30'
$now = Time::now();
// Retorna '2014-04-12 12:22:30'
$now = Time::parse('now');
Manipulação
Depois de criada a instância podemos manipular as instâncias de Time usando métodos setters.
$now = Time::now();
$now->year(2016)
->month(08)
->day(31);
Também podemos usar os métodos providos pelo PHP embutidos na classe DateTime:
$now->setDate(2016, 08, 31);
Datas podem ser modificdas através da subtração e adição de seus componentes:
$now = Time::now();
$now->subDays(5);
$now->addMonth(1);
// Usando strtotime strings.
$now->modify('+5 days');
Você pode receber os componentes internos da data acessando suas propriedades:
$now = Time::now();
echo $now->year; // 2014
echo $now->month; // 5
echo $now->day; // 10
echo $now->timezone; // America/Fortaleza
Também é permitido assinalar diretamente essas propriedades para modificar a data:
$time->year = 2015;
$time->timezone = 'Europe/Paris';
Formatando
static Cake\I18n\Time::setJsonEncodeFormat($format)
O método configura o formato default usado quando convertendo um objeto para json:
Time::setJsonEncodeFormat('yyyy-MM-dd HH:mm:ss');
Este método precisa ser chamado estaticamente.
Cake\I18n\Time::i18nFormat($format = null, $timezone = null, $locale = null)
Algo bem comum a fazer com instâncias de Time é imprimir as datas formatadas. Veja:
$now = Time::parse('2014-10-31');
// Prints a localized datetime stamp.
echo $now;
// Outputs '10/31/14, 12:00 AM' for the en-US locale
$now->i18nFormat();
// Use the full date and time format
$now->i18nFormat(\IntlDateFormatter::FULL);
// Use full date but short time format
$now->i18nFormat([\IntlDateFormatter::FULL, \IntlDateFormatter::SHORT]);
// Outputs '2014-10-31 00:00:00'
$now->i18nFormat('yyyy-MM-dd HH:mm:ss');
Configurando o Locale Padrão e o Formato de String
// The same method exists on Date, FrozenDate, and FrozenTime
Time::setDefaultLocale('pt-BR');
Datas
A classe Date no CakePHP implementa a mesma API e métodos que o Time\ I18n\. A principal diferença entre hora e data é que Data não acompanha componentes de tempo, e está sempre em UTC. Como um exemplo:
use Cake\I18n\Date;
$date = new Date('2015-06-15');
$date->modify('+2 hours');
// Outputs 2015-06-15 00:00:00
echo $date->format('Y-m-d H:i:s');
$date->modify('+36 hours');
// Outputs 2015-06-15 00:00:00
echo $date->format('Y-m-d H:i:s');
Dicas sobre data e hora
Num controller
use Cake\I18n\Time;
use Cake\I18n\Date;
public function index()
{
$time = new Time($this->Auth->user('birtday'));
if ($time->isToday()) {
// Greet user with a happy birthday message
$this->Flash->error(__('Hoje é seu aniversário. Meus parabéns...'));
}
$this->paginate = [
'contain' => ['Groups']
];
$permissions = $this->paginate($this->Permissions);
$this->set(compact('permissions'));
}
Outras formas:
$now = Time::now();
$now->year(2013)
->month(10)
->day(31);
dd($now);
$now = Time::parse('2014-10-31');
$now = Time::parse('2014-10-31');
// Outputs 'Oct 31, 2014 12:00 AM' in en-US
Time::setDefaultLocale('pt-BR');
echo $now;
exit;
$time = new Time($this->Auth->user('modified'));
Time::setDefaultLocale('pt-BR'); // ou Date::setDefaultLocale('pt-BR');
echo $time;
exit;
$time = new Time($this->Auth->user('modified'));
Time::setToStringFormat('dd/MM/yyyy');
echo $time;
exit;
src/Template/Clientes/add.ctp ou edit.ctp
Por padrão o Cake mostra apenas os anos de 2011 até 2021 na combo Ano.
Vamos alterar para que o ano mínimo seja 13 anos antes do atual e máximo seja 100 anos antes do atual, ou seja, como estou em 2016, que mostre de 1916 até 2003, mas isso deve ser pensado para atender ao requisito da tabela/aplicativo. No nosso caso, do DNOCS, devemos usar 18 anos antes, ou mais para o primeiro?
E 100 anos antes do atual ou mais para o segundo.
Precisamos saber da legislação e usar a favor da segurança, deixando uma margem.
echo $this->Form->input('nascimento',['label' => 'Nascimento',
'dateFormat' => 'DMY',
'minYear' => date('Y') - 100,
'maxYear' => date('Y') - 13,
'empty' => [
'day' => 'Dia',
'month' => 'Mês',
'year' => 'Ano'
]
]);
Mais em:
CakePHP usa Chronos para dar poder ao seu utilitário Timer. Qualquer coisa que você possa fazer com Chronos e DateTime você pode fazer com Time e Date:
https://github.com/cakephp/chronos
http://api.cakephp.org/chronos/1.0/
Antes da versão 3.2 o CakePHP usava Carbon:
https://github.com/briannesbitt/Carbon
http://book.cakephp.org/3.0/en/views/helpers/time.html
Comments fornecido por CComment