A questão é como formatar um JavaScript Date
como uma string indicando o tempo decorrido de maneira semelhante à maneira como você vê os horários exibidos no estouro de pilha.
por exemplo
- 1 minuto atrás
- 1 hora atrás
- 1 dia atrás
- 1 mês atrás
- 1 ano atrás
javascript
date-formatting
Sky Sanders
fonte
fonte
Intl.RelativeTimeFormat.prototype.format()
.Respostas:
fonte
Pode ser um exagero nesse caso, mas se a oportunidade aparecer moment.js é simplesmente incrível!
Moment.js é uma biblioteca de data e hora em javascript, para usá-la nesse cenário, você faria:
http://momentjs.com/docs/#/displaying/fromnow/
Adendo 2018 : Luxon é uma nova biblioteca moderna e pode valer a pena dar uma olhada!
fonte
Não marquei (embora não seja difícil), mas acho que os sites do Stack Exchange usam o
jquery.timeago
plug - in para criar essas seqüências de tempo .É muito fácil usar o plugin, é limpo e é atualizado automaticamente.
Aqui está uma amostra rápida (da página inicial do plug-in):
fonte
Isso mostrará os formatos de hora anteriores e anteriores, como '2 dias atrás' e 10 minutos a partir de agora ', e você pode transmiti-lo para um objeto Date, um carimbo de data / hora numérico ou uma string de data
fonte
return time;
porformat = time_formats[time_formats.length - 1]; return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
para retornar séculos por longos períodos de tempo, em vez de milissegundos.Aqui está uma pequena modificação na solução Sky Sander que permite que a data seja inserida como uma sequência e é capaz de exibir intervalos como "1 minuto" em vez de "73 segundos"
fonte
interval = Math.floor(seconds / 60);
. Eu adicioneiinterval = seconds;
na finalelse
e funciona bem.let seconds = Math.floor((+new Date() - date) / 1000);
interval === 0
no últimoif
?Você pode querer olhar para humanized_time_span: https://github.com/layam/js_humanized_time_span
É uma estrutura independente e totalmente personalizável.
Basta baixar / incluir o script e então você pode fazer isso:
ou até isso:
Leia os documentos para mais informações.
fonte
NaN years ago
porquê?humanized_time_span("2011/05/11 12:00:00")
A função acima foi alterada para
Caso contrário, mostraria coisas como "75 minutos" (entre 1 e 2 horas). Agora, ele também assume que a data de entrada é um carimbo de data / hora do Unix.
fonte
Código legível e compatível com vários navegadores:
Como dado por @Travis
fonte
Uma versão mais curta usada por Lokely :
fonte
Infinity seconds ago
a partir de agora, unix timestamp param,
fonte
Uma versão ES6 do código fornecida por @ user1012181
Editado com @ sugestões de ibe-vanmeenen. (Obrigado !)
fonte
Versão simples e legível:
fonte
Eu escrevo um com js e python, usado em dois projetos, muito agradável e simples: uma biblioteca simples (menos de 2kb) usada para formatar a data com a
*** time ago
instrução.simples, pequeno, fácil de usar e bem testado.
npm install timeago.js
import timeago from 'timeago.js'; // or use script tag
use API
format
.Amostra:
Além disso, você pode renderizar em tempo real.
fonte
import { format, render, cancel, register } from 'timeago.js';
Embora a pergunta tenha sido feita há muito tempo, escrever esta resposta com esperança de ajudar alguém.
Passe a data em que deseja começar a contar. Uso
moment().fromNow()
de momentjs : (Veja mais informações aqui )Se você deseja alterar as informações fornecidas para as datas em Agora, escreva seu tempo relativo personalizado por um momento.
Por exemplo, no meu próprio caso, eu queria imprimir em
'one month ago'
vez de'a month ago'
( fornecido pelo momento (d) .fromNow () ). Nesse caso, você pode escrever algo abaixo.NOTA : Escrevi meu código para o projeto no Agular 6
fonte
Também pode usar o plug-in dayjs relativeTime para resolver isso.
fonte
Isso deve lidar adequadamente com qualquer carimbo de data / hora válido, incluindo Date.now (), unidades singulares e datas futuras. Fiquei meses de fora, mas esses devem ser fáceis de adicionar. Tentei mantê-lo o mais legível possível.
fonte
Eu modifiquei a versão do Sky Sanders. As operações Math.floor (...) são avaliadas no bloco if
fonte
return days + "1 day ago";
deveria serreturn "1 day ago";
fonte
fonte
Minha solução ..
fonte
Minha facada nisso com base em outras respostas.
fonte
Eu estava procurando uma resposta para isso e quase implementei uma dessas soluções, mas um colega me lembrou de verificar a
react-intl
biblioteca, pois já a estávamos usando.Então, adicionando às soluções ... no caso de você estar usando a
react-intl
biblioteca, elas têm um<FormattedRelative>
componente para isso.https://github.com/yahoo/react-intl/wiki/Components#formattedrelative
fonte
Aqui está o que eu fiz (o objeto retorna a unidade de tempo junto com seu valor):
fonte