Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

Qualquer simples problema se pode tornar insolúvel se for feito um número suficiente de reuniões para o discutir...(Arthur Bloch)

9.3.3 - TimeHelper

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

https://book.cakephp.org/3.0/en/core-libraries/time.html

http://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-dates

Comments fornecido por CComment

Novo Testamento

E aquele que me enviou está comigo. O Pai não me tem deixado só, porque eu faço sempre o que lhe agrada.
(Jo, 8:29)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper