angular-input-masks icon indicating copy to clipboard operation
angular-input-masks copied to clipboard

Problemas com a mascara de data

Open joaoks opened this issue 8 years ago • 11 comments

Quando eu retorno pro meu objeto no $scope uma data no formato americano a mascara de data se perde e traz errado, por exemplo: No input inicialmente mandei 01/07/1988 ele gravou no banco com a data americana 1988-07-01 quando eu retorno pro mesmo campo a data 1988-07-01 ele formata a data como 19/88/0701, acredito que a formatação de data deveria detectar em qual formato ela está e formatar corretamente.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/33357741-problemas-com-a-mascara-de-data?utm_campaign=plugin&utm_content=tracker%2F1022469&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F1022469&utm_medium=issues&utm_source=github).

joaoks avatar Apr 26 '16 18:04 joaoks

@joaoks sua data esta em string? exemplo: '1988-07-01',

ou é uma ISO String, exemplo: '1988-08-01T03:00:00.000Z'

darlanmendonca avatar Apr 26 '16 19:04 darlanmendonca

Ta como string mesmo

joaoks avatar Apr 26 '16 19:04 joaoks

então creio q seja este o problema, o correto é trabalhar com o type date, ever, seja por Date, ou por ISOString

darlanmendonca avatar Apr 26 '16 20:04 darlanmendonca

certo no caso aqui eu to pegando retorno direto do laravel, em algum dos lados vou ter que converter pra Date. Mas eu tava vendo que é utilzado o momentjs nessa mascara, no caso ela deveria aceitar a data em string normalmente.

joaoks avatar Apr 26 '16 20:04 joaoks

outra coisa que notei aqui eu usei o filtro do moment para exibir em uma tabela os dados e fiz teste tanto como data normal como string e como timestamp e funcionou normalmente, mas no caso da mascara nao funciona mesmo

joaoks avatar Apr 26 '16 21:04 joaoks

Também estou com o mesmo problema, segue o formato da data: "2016-04-27T12:00:00Z". @darlanmendonca pode ajudar?

aizefler avatar Apr 29 '16 23:04 aizefler

só transforme essa data em Date e irá funcionar corretamente

$scope.data = new Date('2016-04-27T12:00:00Z');

danieloprado avatar May 11 '16 13:05 danieloprado

No meu caso o formato da data é 2016-10-10T03:00:00.000Z porém queria que ele o valor ficasse o mesmo da input que no caso é 10/10/2016.

Assim como o @danieloprado comentou, tem como fazer isso usando

    $scope.data = new Date('2016-04-27T12:00:00Z'); 

mas fazer isso para todos os controles que tenho fica complicado.

Poderia ter um parâmetro onde passo o valor para o formato de saída tipo:

 <input ng-model="birth" ui-date-mask="dd/MM/yyyy" />

Ou se tiver alguma outra forma de generalizar o formato do ng-model...

Bleno avatar Nov 25 '16 19:11 Bleno

#DICA

O ideal é transformar todas as string de data na camada de service/factory e trabalhar sempre com o tipo DATE, lógico que isso varia de caso para caso.

Eu criei esse factory para me auxiliar nisso, ele verifica se a key de um object contem 'date' e faz a troca, ou passa um array com as keys:

(function(angular) {
  'use strict';

  angular.module('app').factory('dateHelper', [
    'moment',
    DateHelper
  ]);

  function DateHelper(moment) {

    function parseObj(obj, fields) {
      if (!fields) {
        fields = Object.keys(obj).filter(x => x.toLowerCase().indexOf('date') > -1);
      }

      fields.forEach(key => {
        if (!obj[key]) return;
        obj[key] = new Date(obj[key]);
      });

      return obj;
    }

    return { parseObj };

  }

})(angular);

Chamada:

$http.get(`${API}/appointment`).then(response => {
    return response.data.map(item => dateHelper.parseObj(item));
});
//ou
$http.get(`${API}/appointment`).then(response => {
    return response.data.map(item => dateHelper.parseObj(item, ['create', 'date', 'foo']));
});
//ou apenas um object
dateHelper.parseObj({ name: 'Daniel Prado', birthday: '2016-04-27T12:00:00Z'}, ['birthday']);

Fica mais fácil de trabalhar se todos dates que vem da api serem dates mesmo. Quando enviar para o servidor é bom mandar em ISO pois pode ter problemas com timezone.

É apenas uma dica ;)

danieloprado avatar Nov 25 '16 19:11 danieloprado

Obrigado @danieloprado pela sugestão, vou ver se cabe essa implementação ao meu caso!

Bleno avatar Nov 28 '16 13:11 Bleno

No meu caso, as datas estão chegando em timestamp, o que eu faço?

marciosto78 avatar Jul 17 '18 18:07 marciosto78