without with new moment from javascript datetime time relative-date

with - Marca de tiempo de Javascript a tiempo relativo(por ejemplo, hace 2 segundos, hace una semana, etc.), mejores métodos?



timeago js (9)

Aquí está la imitación exacta de Twitter hace tiempo sin complementos:

function timeSince(timeStamp) { var now = new Date(), secondsPast = (now.getTime() - timeStamp.getTime()) / 1000; if(secondsPast < 60){ return parseInt(secondsPast) + ''s''; } if(secondsPast < 3600){ return parseInt(secondsPast/60) + ''m''; } if(secondsPast <= 86400){ return parseInt(secondsPast/3600) + ''h''; } if(secondsPast > 86400){ day = timeStamp.getDate(); month = timeStamp.toDateString().match(/ [a-zA-Z]*/)[0].replace(" ",""); year = timeStamp.getFullYear() == now.getFullYear() ? "" : " "+timeStamp.getFullYear(); return day + " " + month + year; } }

Gist https://gist.github.com/timuric/11386129

Fiddle http://jsfiddle.net/qE8Lu/1/

Espero eso ayude.

Estoy buscando un buen fragmento de JS para convertir una marca de tiempo (por ejemplo, de la API de Twitter) en un tiempo relativamente agradable para el usuario (por ejemplo, hace 2 segundos, hace una semana, etc.).

¿Alguien quiere compartir algunos de sus métodos preferidos (preferiblemente sin usar complementos)?


Bueno, es bastante fácil si no te preocupa demasiado la precisión. ¿Qué pasa con el método trivial?

function timeDifference(current, previous) { var msPerMinute = 60 * 1000; var msPerHour = msPerMinute * 60; var msPerDay = msPerHour * 24; var msPerMonth = msPerDay * 30; var msPerYear = msPerDay * 365; var elapsed = current - previous; if (elapsed < msPerMinute) { return Math.round(elapsed/1000) + '' seconds ago''; } else if (elapsed < msPerHour) { return Math.round(elapsed/msPerMinute) + '' minutes ago''; } else if (elapsed < msPerDay ) { return Math.round(elapsed/msPerHour ) + '' hours ago''; } else if (elapsed < msPerMonth) { return ''approximately '' + Math.round(elapsed/msPerDay) + '' days ago''; } else if (elapsed < msPerYear) { return ''approximately '' + Math.round(elapsed/msPerMonth) + '' months ago''; } else { return ''approximately '' + Math.round(elapsed/msPerYear ) + '' years ago''; } }

Ejemplo de trabajo here .

Es posible que desee ajustarlo para manejar mejor los valores singulares (por ejemplo, 1 day lugar de 1 days ) si eso le molesta.


Inspirado en el plugin de Diego Castillo awnser y en el plugin http://timeago.yarp.com/ , escribí mi propio plugin de vanilla para esto.

var timeElement = document.querySelector(''time''), time = new Date(timeElement.getAttribute(''datetime'')); timeElement.innerText = TimeAgo.inWords(time.getTime());

var TimeAgo = (function() { var self = {}; // Public Methods self.locales = { prefix: '''', sufix: ''ago'', seconds: ''less than a minute'', minute: ''about a minute'', minutes: ''%d minutes'', hour: ''about an hour'', hours: ''about %d hours'', day: ''a day'', days: ''%d days'', month: ''about a month'', months: ''%d months'', year: ''about a year'', years: ''%d years'' }; self.inWords = function(timeAgo) { var seconds = Math.floor((new Date() - parseInt(timeAgo)) / 1000), separator = this.locales.separator || '' '', words = this.locales.prefix + separator, interval = 0, intervals = { year: seconds / 31536000, month: seconds / 2592000, day: seconds / 86400, hour: seconds / 3600, minute: seconds / 60 }; var distance = this.locales.seconds; for (var key in intervals) { interval = Math.floor(intervals[key]); if (interval > 1) { distance = this.locales[key + ''s'']; break; } else if (interval === 1) { distance = this.locales[key]; break; } } distance = distance.replace(/%d/i, interval); words += distance + separator + this.locales.sufix; return words.trim(); }; return self; }()); // USAGE var timeElement = document.querySelector(''time''), time = new Date(timeElement.getAttribute(''datetime'')); timeElement.innerText = TimeAgo.inWords(time.getTime());

<time datetime="2016-06-13"></time>


Los complementos de Datetime existen porque es muy difícil hacerlo bien. Este video que explica las inconsistencias de fecha y hora arrojará algo de luz sobre el tema.

Todas las soluciones anteriores sin complementos son incorrectas.

Para trabajar con fechas y horas es preferible usar un complemento . De los cientos de complementos que se ocupan de él, utilizamos Moment.js y está haciendo el trabajo.

Desde la información de Twitter API , podemos ver su formato de marca de tiempo:

"created_at":"Wed Aug 27 13:08:45 +0000 2008"

Podemos analizarlo con Moment.js

const postDatetime = moment( "Wed Aug 27 13:08:45 +0000 2008", "dddd, MMMM Do, h:mm:ss a, YYYY" ); const now = moment(); const timeAgo = now.diff(postDatetime, ''seconds'');

Para especificar la unidad de tiempo preferida para el diff , podemos usar el método isSame . p.ej:

if (now.isSame(postDatetime, ''day'')) { const timeUnit = ''days''; }

En general, construyendo algo como:

`Posted ${timeAgo} ${timeUnit} ago`;

Consulte la documentación de su complemento para manejar los cálculos de tiempo relativo (es decir: "¿Cuánto tiempo atrás?").


Para cualquier persona interesada, terminé creando un ayudante de manubrio para hacer esto. Uso:

{{#beautify_date}} {{timestamp_ms}} {{/beautify_date}}

Ayudante:

Handlebars.registerHelper(''beautify_date'', function(options) { var timeAgo = new Date(parseInt(options.fn(this))); if (Object.prototype.toString.call(timeAgo) === "[object Date]") { if (isNaN(timeAgo.getTime())) { return ''Not Valid''; } else { var seconds = Math.floor((new Date() - timeAgo) / 1000), intervals = [ Math.floor(seconds / 31536000), Math.floor(seconds / 2592000), Math.floor(seconds / 86400), Math.floor(seconds / 3600), Math.floor(seconds / 60) ], times = [ ''year'', ''month'', ''day'', ''hour'', ''minute'' ]; var key; for(key in intervals) { if (intervals[key] > 1) return intervals[key] + '' '' + times[key] + ''s ago''; else if (intervals[key] === 1) return intervals[key] + '' '' + times[key] + '' ago''; } return Math.floor(seconds) + '' seconds ago''; } } else { return ''Not Valid''; } });


Puede usar machinepack-datetime para este propósito. Es fácil y claro con su API definida.

tutorialSchema.virtual(''createdOn'').get(function () { const DateTime = require(''machinepack-datetime''); let timeAgoString = ""; try { timeAgoString = DateTime.timeFrom({ toWhen: DateTime.parse({ datetime: this.createdAt }).execSync(), fromWhen: new Date().getTime() }).execSync(); } catch(err) { console.log(''error getting createdon'', err); } return timeAgoString; // a second ago });


Si necesita multilingüe y no desea agregar una gran biblioteca como momento. intl-relativeformat de yahoo es una buena solución.

var rf = new IntlRelativeFormat(''en-US''); var posts = [ { id : 1, title: ''Some Blog Post'', date : new Date(1426271670524) }, { id : 2, title: ''Another Blog Post'', date : new Date(1426278870524) } ]; posts.forEach(function (post) { console.log(rf.format(post.date)); }); // => "3 hours ago" // => "1 hour ago"


Tada! Timeago: http://timeago.yarp.com/

Oh, espera, ¿sin complementos? ¿Por qué es eso entonces? Supongo que podrías abrir el archivo de complemento y cortar las agallas.


También hay sugar.js y función relative para este propósito.

relative: genera una cadena en unidades relativas a la fecha actual ("ago" o "from now").