Sou pai há 1,5 anos e isso fica claramente demonstrado por ter chegado a tempo de fundir os PRs ou de levar este pacote ainda mais longe. O tempo é a maior restrição aqui. Eu ficaria feliz em passar o projeto para alguém que tenha mais tempo e motivação para levar o projeto adiante. Apenas me mande uma mensagem. Saúde!
_ _ _ __ ___ ___ _ __ ___ ___ _ __ | |_ _ __ | |__ _ __ | '_ ` _ / _ | '_ ` _ / _ '_ | __| | '_ | '_ | '_ | | | | | | (_) | | | | | | __/ | | | |_ _| |_) | | | | |_) | |_| |_| |_|___/|_| |_| |_|___|_| |_|__(_) .__/|_| |_| .__/ |_| |_|
Registro de alterações
Biblioteca de datas para análise, manipulação e formatação de datas com i18n.
PHP 5.3 ou posterior, já que moment.php é baseado na classe DateTime do php.
Fácil instalação via compositor. Ainda não tem ideia do que é compositor? Informe-se aqui.
composer require fightbulc/moment
$m = new MomentoMomento(); // o padrão é "agora" UTCecho $m->format(); // por exemplo, 2012-10-03T10:00:00+0000$m = new MomentMoment('now', 'Europe/Berlin');echo $m->format(); // por exemplo, 2012-10-03T12:00:00+0200$m = new MomentMoment('2017-06-06T10:00:00', 'Europe/Berlin');echo $m->format(); // por exemplo, 2012-10-03T12:00:00+0200$m = new MomentMoment(1499366585);echo $m->format(); // por exemplo, 2017-07-06T18:43:05+0000
O Moment analisa os seguintes formatos de data como entrada:
const ATOM = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00const COOKIE = 'l, dMy H:i:s T'; // Segunda-feira, 15 de agosto de 2005 15:52:01 UTCconst ISO8601 = 'Ym-dTH:i:sO'; // 2005-08-15T15:52:01+0000const RFC822 = 'D, d M e H:i:s O'; // Seg, 15 de agosto 05 15:52:01 +0000const RFC850 = 'l, dMy H:i:s T'; // Segunda-feira, 15 de agosto de 2005 15:52:01 UTCconst RFC1036 = 'D, d M y H:i:s O'; // Seg, 15 de agosto 05 15:52:01 +0000const RFC1123 = 'D, d M Y H:i:s O'; // Seg, 15 de agosto de 2005 15:52:01 +0000const RFC2822 = 'D, d M Y H:i:s O'; // Seg, 15 de agosto de 2005 15:52:01 +0000const RSS = 'D, d M Y H:i:s O'; // Seg, 15 de agosto de 2005 15:52:01 +0000const W3C = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00// Moment também tenta analisar datas sem fuso horário ou sem segundosconst NO_TZ_MYSQL = 'Ymd H:i:s'; // 15/08/2005 15:52:01const NO_TZ_NO_SECS = 'Ymd H:i'; // 15/08/2005 15:52const NO_TIME = 'Ymd'; // 2005-08-15// frações de tempo ".000" serão removidas automaticamente$timeWithFraction = '2016-05-04T10:00:00.000';
Dê uma olhada na pasta Locales
para ver todos os idiomas suportados. A localidade padrão é en_GB
.
$m = new MomentMoment();echo $m->format('[Dia da semana:] l'); // por exemplo, dia da semana: quarta-feira // set alemão localeMomentMoment::setLocale('de_DE');$m = new MomentMoment();echo $m->format('[Wochentag:] l'); // por exemplo, Wochentag: Mittwoch
Idiomas suportados até agora:
ar_TN
Árabe (Tunísia) ca_ES
Catalão cs_CZ
Tcheco da_DK
Dinamarquês de_DE
Alemão (Alemanha) en_CA
Inglês (Canadá) en_GB
Inglês (Britânico) en_US
Inglês (Americano) eo_EO
Esperanto es_ES
Espanhol (Europa) fa_IR
Farsi fi_FI
Finlandês fr_CA
Francês (Canadá) fr_FR
Francês ( Europa) hu_HU
Húngaro id_ID
Indonésio it_IT
Italiano ja_JP
Japonês kz_KZ
Cazaque lv_LV
Letão (Latviešu) nl_NL
Holandês oc_LNC
Lengadocian pl_PL
Polonês pt_BR
Português (Brasil) pt_PT
Português (Portugal) ru_RU
Russo (versão básica) sv_SE
Sueco th_TH
Tailandês tr_TR
Turco uk_UA
Ucraniano vi_VN
Vietnamita zh_CN
Chinês zh_TW
Chinês (tradicional)
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->setTimezone('UTC')->format(); //2012-04-25T01:00:00+0000
MomentMoment::setDefaultTimezone('CET');$m = new MomentMoment('2016-09-13T14:32:06');echo $m->format(); // 13/09/2016T14:32:06+0100
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->format('l, dS F Y / H:i (e)'); // Quarta-feira, 25 de abril de 2012 / 03:00 (Europa/Berlim)
Os formatos são baseados na função Date e na classe DateTime do PHP.
Agora você pode injetar manipulação de formato diferente passando uma classe que implementa FormatsInterface
. Você pode encontrar um exemplo na pasta de teste para implementar todos os formatos do moment.js. Obrigado a Ashish por dedicar seu tempo para combinar os formatos moment.js
com os do PHP. Dê uma olhada no script de teste para ver o exemplo em ação.
Todos podem escrever classes de formato da mesma maneira. É fácil e escalável.
// obtém a classe dos formatos desejados// cria um momento$m = new MomentMoment('2012-04-25T03:00:00', 'CET');// formata com moment.js definitionsecho $m->format('LLLL ', new MomentCustomFormatsMomentJs()); // Quarta-feira, 25 de abril de 2012 3h00
Custom formats
também podem fazer parte de cada Locale
. Se ainda não existir para sua localidade, vá em frente e adicione-o. Veja um exemplo para a localidade francesa.
Basta colocar todo o seu texto entre []
e todos os caracteres terão escape automático para você.
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->format('[Estamos no mês de:] F'); // Estamos no mês de: abril
O cálculo ordinal interal do PHP parece ter erros. Adicionei uma solução rápida para lidar com esse problema.
O exemplo a seguir imprime a semana do ano da data especificada. Deve imprimir 22nd
:
// functiondate interno('WS', mktime(12, 22, 0, 5, 27, 2014)); // 22// moment.php$m = new MomentMoment('2014-05-27T12:22:00', 'CET');$m->format('WS'); //22
$m = new MomentMoment('2012-05-15T12:30:00', 'CET');echo $m->addHours(2)->format(); // 2012-05-15T14:30:00+0200$m = new MomentMoment('2012-05-15T12:30:00', 'CET');echo $m->subtractDays(7)->subtractMinutes(15 )->formato(); // 2012-05-08T12:15:00+0200$m = new MomentMoment('@1401443979', 'CET'); // unix timeecho $m->subtractDays(7)->subtractMinutes(15)->format(); //2014-05-23T09:44:39+0000
Às vezes é útil aproveitar um determinado momento e trabalhar com ele sem alterar a origem. Para isso use cloning()
.
$m = new MomentMoment('2012-05-15T12:30:00', 'CET');$c = $m->cloning()->addDays(1);echo $m->getDay(); // 15echo $c->getDay(); // 16
Como alternativa, você pode ativar o modo imutável na origem.
$m = new MomentMoment('2012-05-15T12:30:00', 'CET', true);$c = $m->addDays(1);echo $m->getDay(); // 15echo $c->getDay(); // 16// Você também pode alterar o modo imutável após a criação:$m->setImmutableMode(false)->subtractDays(1);echo $m->getDay(); // 14
O modo imutável faz com que todos os métodos de modificação chamem cloning()
implicitamente antes de aplicar suas modificações.
Adicionar | Subtrair |
---|---|
addSeconds($s) | subtrairSegundos($s) |
addMinutos($i) | subtrairMinutos($i) |
addHoras($h) | subtrairhoras($h) |
addDias($d) | subtrairDias($d) |
addSemanas($w) | subtrairSemanas($w) |
addMonths($m) | subtrairMeses($m) |
addAnos($y) | subtrair anos($y) |
Levantador | Obtém |
---|---|
setSegundo($s) | getSegundo() |
setMinuto($m) | getMinuto() |
setHora($h) | getHora() |
setDay($d) | getDia() |
setMês($m) | getMês() |
setAno($y) | getAno() |
-- | getQuarter() |
$m = new MomentMoment('2013-02-01T07:00:00');$momentFromVo = $m->fromNow();// ou de um momento específico$m = new MomentMoment('2013-02-01T07: 00:00');$momentoFromVo = $m->from('2011-09-25T10:00:00');// o resultado vem como um objeto de valor classecho $momentFromVo->getDirection() // "futuro"echo $momentFromVo->getSeconds() // -42411600echo $momentFromVo->getMinutes() // -706860echo $momentFromVo->getHours() // -11781echo $momentFromVo->getDays() // -490.88echo $momentFromVo->getWeeks() // -70.13echo $momentFromVo->getMonths() // -17.53echo $momentFromVo- >getAnos() // -1.42echo $momentFromVo->getRelative() // em um ano
Às vezes é útil obter os limites do período de uma determinada data. Por exemplo, caso hoje seja quarta-feira e eu precise das datas de início/término da semana de hoje. Os períodos permitidos são week
, month
e quarter
.
$m = new MomentMoment('2013-10-23T10:00:00');$momentPeriodVo = $m->getPeriod('week');// os resultados vêm junto com um objeto de valor classecho $momentPeriodVo->getStartDate( ) ->formato('Ymd'); // 21/10/2013echo $momentPeriodVo->getEndDate() ->formato('Ymd'); // 27/10/2013echo $momentPeriodVo->getRefDate() ->formato('Ymd'); // 23/10/2013echo $momentPeriodVo->getInterval(); // 43 = semana do ano
Mesmo procedimento para períodos mensais e trimestrais:
$momentPeriodVo = $m->getPeriod('mês');$momentPeriodVo = $m->getPeriod('trimestre');
A hora do calendário exibe a hora relativa a now
, mas de maneira um pouco diferente de Moment::fromNow()
. Moment::calendar()
irá formatar uma data com strings diferentes dependendo de quão próxima de hoje a data está.
(new MomentMoment('2014-03-30T16:58:00', 'CET'))->subtractDays(6)->calendar(); // semana passada(new MomentMoment('2014-03-30T16:58:00', 'CET'))->subtractDays(1)->calendar(); // ontem(new MomentMoment('2014-03-30T16:58:00', 'CET'))->calendar(); // hoje(new MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(1)->calendar(); // amanhã(new MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(3)->calendar(); // próxima semana(new MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(10)->calendar(); // todo o resto
Tempo | Mostrar |
---|---|
Semana passada | Última segunda-feira às 15h54 |
No dia anterior | Ontem às 15h54 |
No mesmo dia | Hoje às 15h54 |
No dia seguinte | Amanhã às 15h54 |
Na próxima semana | Quarta-feira às 15h54 |
Todo o resto | 09/04/2014 |
Nota: Use $moment->calendar(false)
para omitir o horário at 00:00
.
O mesmo processo de moment.js: altera o momento original, configurando-o para o início/fim de uma unidade de tempo.
$m = new MomentMoment('20140515T10:15:23', 'CET');$m->startOf('ano'); // definido para 1º de janeiro, 00:00 deste ano$m->startOf('quarter'); // definido para o início do trimestre atual, 1º dia do mês, 00:00$m->startOf('month'); // definido para o primeiro dia deste mês, 00:00$m->startOf('week'); // definido para o primeiro dia desta semana, 00:00$m->startOf('day'); // definido para 00:00 hoje$m->startOf('hour'); // definido como agora, mas com 0 minutos, 0 segundos$m->startOf('minuto'); // definido como agora, mas com 0 segundos$m->endOf('year'); // definido para 31 de dezembro, 23h59 deste ano$m->endOf('quarter'); // definido para o final do trimestre atual, último dia do mês, 23:59$m->endOf('month'); // definido para o último dia deste mês, 23:59$m->endOf('week'); // definido para o último dia desta semana, 23:59$m->endOf('day'); // definido para 23h59 de hoje$m->endOf('hour'); // definido como agora, mas com 59 minutos, 59 segundos$m->endOf('minuto'); // definido como agora, mas com 59 segundos
Nota: ignorei o período de second
, pois não estamos lidando com milissegundos.
Para um de meus clientes, eu precisava obter momentos em dias da semana selecionados. A tarefa era: dar-me as datas das Tuesdays
e Thursdays
das próximas três semanas. Então adicionei um pequeno manipulador que faz exatamente isso. Como resultado você receberá um array preenchido com Moment Objects
.
// 1 - 7 = Seg - Dom$weekdayNumbers = [2, // terça4, // quinta];$m = new MomentMoment();$dates = $m->getMomentsByWeekdays($weekdayNumbers, 3);// $ datas = [Momento, Momento, Momento...]
Agora você pode percorrer o resultado e colocá-lo formatado em um campo suspenso ou para o que for necessário.
Tente portar métodos úteis do moment.js
Adicionar testes unitários
adicionado:
suporte para PHP 8.2 #218
suporte para PHP 8.3 #227
fixo:
localidade francesa
Testes canadenses
adicionado:
Local esperanto
Local do Cazaquistão
fixo:
Correspondência de assinatura DateTime::createFromFormat
adicionado:
Local persa
adicionado:
verificações de código em relação aos fluxos de trabalho de ação do GH
Local canadense para inglês/francês
fixo:
fundir-se com alguns PRs (obrigado!)
adicionado:
Concluir localidade
fixo:
localidade sueca
localidade italiana atualizada
adicionado:
formatos personalizados para en_US
sinalizador para carregar localidade semelhante
problema de dica de tipo corrigido
fixo:
faltando formato relativoTime
permitir unixtime de 9 dígitos
RFC2822 corrigido como formato válido
tempo relativo fixo
adicionado localidade norueguesa
correções e adições de localidade (veja commits para 22/11/2018)
fixo:
localidade occitana
fixo:
Problema de localidade russa
adicionado:
Português (pt_PT)
fixo:
Pedido de localidade húngara durante a semana
adicionado:
permitir inicializar o Moment com carimbo de data / hora unix sem iniciar @
fixo:
Corrigir formato de 'LLL' em formatos personalizados
fixo:
removida apenas a sintaxe do php5.4+
fixo:
Nomes de dias e meses em dinamarquês caso correto
localidade francesa
PHPDocs
adicionado:
consts para NO_TZ_MYSQL
, NO_TZ_NO_SECS
e NO_TIME
ao analisar datas
adicionado:
CustomFormat holandês
fixo:
localidade russa
adicionado:
localidade turca
fixo:
Local Lengadociano
fixo:
PHP7.1 setTime requer $microseconds
adicionado:
localidade ucraniana
adicionado:
localidade húngara
fixo:
Local Lengadociano
adicionado:
localidade vietnamita
Local Lengadociano
adicionado:
Alterar fuso horário padrão
fixo:
Documentos de interface de formatos
adicionado:
localidade árabe
Formato personalizado em nível de localidade
fixo:
localidade russa
adicionado:
Testes de localidade russa
fixo:
localidade polonesa
Cálculo de segundos
fixo:
Russo: mais correções de tempo relativas
fixo:
Hora relativa da localidade russa: tratamento do dia
fixo:
faltando manipulação imutável
fixo:
Local polonês aprimorado (adicionado Nominativ)
fixo:
localidade chinesa
adicionou formatos aceitos ao README
fixo:
Local tailandês
adicionado:
localidade catalã
fixo:
Teste de localidade polonesa
adicionado:
localidade russa
fixo:
Teste de localidade polonesa
adicionado:
Modo imutável
fixo:
localidade polonesa
adicionado:
localidade polonesa
adicionado:
Local indonésio
adicionado:
localidade japonesa
fixo:
erro de digitação na localidade holandesa
adicionado:
localidade holandesa
adicionado:
localidade sueca
adicionado:
localidade dinamarquesa
fixo:
dia de semana de início/término fixo para localidade romena
fixo:
adicionando caractere delimitador à localidade italiana
fixo:
retornando nova instância para startOf/endOf para semana, mês, trimestre
adicionado:
localidade Tcheco
adicionado:
a localidade calendar
recebe como Closure os seguintes parâmetros function(Moment $m) {}
O local relativeTime
recebe como Closure os seguintes parâmetros function($count, $direction, Moment $m) {}
adicionado:
fechamentos de passagem fixos para localidade (calendário, relativoTime)
definir informações corretas de localidade alemã
adicionado:
strings de localidade tailandesas fixas
adicionado:
local chinês tradicional
adicionado:
localidade Chinês
o formatador ordinal recebe agora o token
, por exemplo, o token dentro dS
é d
corrigido: problema ordinal em inglês para números entre 11 e 13
adicionado: locale Italiano
corrigido: problema ordinal em inglês
adicionado: localidade Português
fixo:
A localidade exibiu o nome do mês errado (#34)
Alterada a ordem dos dias da semana nos arquivos de localidade
adicionado:
getWeekdayNameLong()
getWeekdayNameShort()
getMonthNameLong()
getMonthNameShort()
adicionado:
Local: Tailandês
adicionado:
getMeses()
getAnos()
getRelativo()
Localidade
MomentoDeVo:
fixo:
getSeconds() mostra agora a direção também
MomentoDeVo:
fixo:
problema de fuso horário que ocorreu apenas para datas unixtime
outro:
direção retorna agora: "futuro" (-) / "passado" (+)
valores de tempo agora são convertidos em tipo como flutuantes
MomentoDeVo:
fixo:
fuso horário não reconhecido ao construir um momento
adicionado:
getMomentsByWeekdays()
getWeekday()
getWeekOfYear()
outro:
texto escapado
adicionado:
por exemplo, [Hello World]
será automaticamente transformado em Hello World
por exemplo, WS
para a 21ª semana do ano mostra agora 21th
correta, etc.
obter o período de um determinado trimestre em um determinado ano
week
= semana do ano
month
= mês do ano
quarter
= trimestre do ano
crie um novo momento mutável com base na instância fornecida
startOf e endOf conforme implementado por moment.js
obter o período trimestral de uma determinada data
setDia()
getDia()
setMês()
getMês()
setAno()
getAno()
getQuarter()
setSegundo()
getSegundo()
setMinuto()
getMinuto()
definirHora()
getHora()
clonagem adicionada()
adicionado getInterval()
a MomentPeriodVo
para indicar o intervalo de um determinado período
adicionou uma classe estática MomentHelper
cálculo ordinal interno do PHP corrigido (também em combinação com a formatação moment.js)
agora você pode escapar do texto envolvendo-o em []
removido:
adicionar()
subtrair()
adicionado:
formato de calendário conforme implementado por moment.js
fixo:
incompatibilidade com PHP 5.3
adicionado:
teste para datas com formato YYYY-mm-dd
e YYYY-mm-ddTHH:ii:ss
lança MomentException em datas inválidas
Lançamento de exceção como MomentException
Validação de data na instanciação:
adicionarSegundos()
adicionarMinutos()
adicionarHoras()
adicionarDias()
adicionarSemanas()
adicionar Meses()
adicionarAnos()
subtrairSegundos()
subtrairMinutos()
subtrairHoras()
subtrairDias()
subtrairSemanas()
subtrair Meses()
subtrair anos()
obsoleto:
adicionar()
subtrair()
Os mantenedores deste projeto sugerem seguir o guia de contribuição.
Moment.php pode ser distribuído gratuitamente sob os termos da licença do MIT.
Direitos autorais (c) 2017 Tino Ehrich
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.