Ir para conteúdo
michelmfreitas

Problemas com DateTime::createFromFormat

Recommended Posts

Olá pessoal, gostaria de tirar uma dúvida sobre o DateTime::createFromFormat.

 

Utilizo ele no site normalmente, obedecendo sua sintaxe. Porém, em algumas páginas, ele mostra o erro:

Error:  Call to a member function format() on a non-object 

Mas em outras seções do site ele funciona, o que me permite imaginar que não é sobre versão do PHP utilizada (5.4.10).

<?php echo DateTime::createFromFormat('Y-m-d' , $data)->format('d/m/Y'); } ?>

Isso já ocorreu algumas vezes e sempre que pesquiso na internet vejo alternativas e resolvo. Mas eu quero entender o por quê desta função funcionar em um Controller e View por exemplo, e não funcionar em outro.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não for possível criar a data, o método DateTime::createFromFormat retorna FALSE. Você deve validar antes:

if(($date = DateTime::createFromFormat('Y-m-d' , $data) !== false) {
   $date->format('d/m/Y');
}

Pode validar a instância também (antes do PHP 5.5):

if(($date = \DateTime::createFromFormat('Y-m-d' , $data) instanceof \DateTime) {
   $date->format('d/m/Y');
}

PHP >= 5.5

if(($date = \DateTime::createFromFormat('Y-m-d' , $data) instanceof \DateTimeInterface) {
   $date->format('d/m/Y');
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por silvagno
      Boa tarde,
       
      Tenho a seguinte input date time,  o que acontece que essa input chama sua id, porem não funciona com o meu script porque o script chama name e quando mudo para id não funciona o date time.
      É um script de replaceAll, ou seja ao selecionar a data e a hora no date time em teoria deveria substituir (NOME DO CLIENTE) pela data e hora.
       
      Bom, eu gostaria de saber se tem como modificar o script para chamar a id em vez do name ou ajustar a input para ser chamada por name.
      $('input[name="demo3"]').change(function(){ var nome = $(this).val(); var text = $('textarea[name="nome pessoal"]').val(); $('textarea[name="nome pessoal"]').val(text.replaceAll('(NOME DO CLIENTE)',nome)); }); <input id="demo3" type="text" size="25"><a href="javascript:NewCal('demo3','ddmmmyyyy',true,24)"><img src="images/cal.gif" width="16" height="16" border="0" alt="Pick a date"></a>  
    • Por Rodymb
      Bom dia!
       
      Preciso fazer um update em um campo do tipo  int de uma tabela para corrigir o horário e a informação que estou buscando está em um campo do tipo datetime de outra tabela. Fiz um update da seguinte forma:
       
      update zan_m00 set m00zc=(SELECT convert(varchar(11),dataemissao,114) FROM tab_nota_header where dataemissao between '2018-08-01 00:00:00' and '2018-08-01 23:59:59' and numpdv=111 and codloja=1 and numnota=74841) where m00af='2018-08-01' and m00za=1 and m00ac=111 and m00ad=69614
       
      Esse update retornou a seguinte mensagem:
      Falha ao converter o varchar valor '11:56:57:00' para o tipo de dados int.
       
      No lugar onde está varchar experimentei usar int, entretanto, ele faz o update somando todo o conteúdo do campo, também usei o CAST e o problema é o mesmo.
      Se eu fizer somente o select, ele retorna pra mim somente a hora, que é o que preciso, mas aí tem outro problema, no campo tipo int a hora é tudo junto 115657 e nesse select ele retorna 11:56:57.
       
      Existe alguma forma de fazer esse update da forma que preciso?
       
    • Por Luis Fernando R. Valle
      Boa tarde.
      Tenho um agendamento para inserir. Mas antes de inserir, preciso validar para ver se não há agendamento no intervalo selecionado
       
      Hoje estou fazendo 2 campos para data inicial e final e 2 campos para horario inicial e final, mas não estou conseguindo.
      Se puder me passar se a melhor forma e o datetime e como fazer essa consulta no banco.
       
      Desde já agradeço.
    • Por Blogger
      Boa noite pessoal, eh meu primeiro topico aqui, preciso muito da ajuda de voces para resolver uma questao em meu site...
      Tenho um aplicativo que puxa algumas informacoes do meu site via http.. certo..
      uma delas sao 2 horarios, de abertura e de fexamento, supoe o seguinte:
       
      HorInicio: 8:00
      Horfim: 18:00     
      No php fica assim..
      (esse date(`w`) == 2) confere se hoje eh terca feira, tenho um desse para cada dia da semana)
      if(date('w') == 2){ // caso a hora atual for maior ou igual a hora inicio e menor ou igual ao fim ele manda true para meu app e ele entende que esta aberto if(date('H:i') >= $ini AND date('H:i') <= $fim){ echo true; } else { echo 0; } } Eu consegui configurar de uma forma que ele entenda que o estabelecimento fica aberto entre esses dois horarios, porem, surgiu a necessidade de colocar o seguinte:
      HorInicio:18:00
      Horfim: 2:00 (Sendo esse horario duas horas da madrugada do dia seguinte)
       
      a questao eh, como fazer meu codigo de php entender que essas 2:00 se trata do dia seguinte? pois da forma atual ele pega o intervalo entre 2:00 e 18:00 (3:00, 4:00, ate as 18:00)
      e eu gostaria que fosse das 18:00 para frente (19:00, 20:00, ate as 2:00)
       
      No meu banco esta definido apenas como tempo atual sem a data, eh possivel fazer sem cadastrar uma data no banco? apenas com o tempo... e se nao for possivel, como fazer isso ser automatico? toda vez que ele for entrar nesse php ele entender qual dia eh hoje e que fica aberto ate amanha ate que horas..
       
      Desculpe se ficou meio confuso.. mas qualquer duvida podem perguntar que eu vou responder, espero alguma luz, obrigado!
       
    • Por Casas Junior
      Galera.. Acho que é até uma pergunta boba.. mas olha to quebrando a cabeça...
       
      Tenho um formulário de cadastro, funcionando direitinho, somente com campo data de expiração é que não to sabendo fazer..
       
      Por Exemplo: Se no campo data de expiração eu digitar 26/06/2018 04:20:00 no banco de dados fica tudo zerado 0000-00-00 00:00:00
      Mas se no campo data de expiração eu digitar 2018-06-26 04:20:00 ele de fato grava no banco
       
      Minha dúvida é.. Onde eu vou tratar essa conversão?
      No formulário de cadastro (exemplo:  cadastrar.php) ou na página onde faz o processamento, (exemplo: cadastrando.php) ???
       
      O echo eu consigo de boa, converter para o formato que eu quero, mas meu problema é a inserção de dados no banco, considerando que quem olha o banco em si fica no formato americano, claro.
       
      No banco o campo é datetime.
       
      cadastrar.php
      <input name="dataexpiracao" required type="text" placeholder="00/00/0000 00:00:00" size="20" maxlength="20" /> cadastrando.php
      $dataexpiracao=$_POST['dataexpiracao'];  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.