Existe-t-il une bibliothèque ou une classe gratuite pour formater une date de manière élégante telle que “5 minutes auparavant” ou “hier”?
Je serais satisfait du même code dans un autre langage que je pourrais porter dans Actionscript (comme Java ou C #)
cela aiderait-il? Devrait être très facile à mettre en port pour AS3.
/* * JavaScript Pretty Date * Copyright (c) 2008 John Resig (jquery.com) * Licensed under the MIT license. */ // Takes an ISO time and returns a ssortingng representing how // long ago the date represents. function prettyDate(time){ var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")), diff = (((new Date()).getTime() - date.getTime()) / 1000), day_diff = Math.floor(diff / 86400); if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 ) return; return day_diff == 0 && ( diff < 60 && "just now" || diff < 120 && "1 minute ago" || diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" || diff < 7200 && "1 hour ago" || diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") || day_diff == 1 && "Yesterday" || day_diff < 7 && day_diff + " days ago" || day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago"; } // If jQuery is included in the page, adds a jQuery plugin to handle it as well if ( typeof jQuery != "undefined" ) jQuery.fn.prettyDate = function(){ return this.each(function(){ var date = prettyDate(this.title); if ( date ) jQuery(this).text( date ); }); };
J’utilise ce code temporel relatif pour un widget Twitter sur lequel je travaille. C’est du PHP, mais rien de spécifique, donc un portage devrait être assez facile.
J’ai fini par écrire le mien.
/** * Takes a Date object and returns a ssortingng in the format * "X UNITS ago" where X is a number and UNITS is a unit of * time. Also has some other ssortingngs like "yesterday". * * @author Mims Wright (with thanks to John Resig) * * @param date The date to convert to a past ssortingng. * @param now Optional time to compare against. Default will be the present. */ public function getTimeElapsedSsortingng(date:Date, now:Date = null):Ssortingng { const SEC_PER_MINUTE:int = 60; const SEC_PER_HOUR:int = SEC_PER_MINUTE * 60; const SEC_PER_DAY:int = SEC_PER_HOUR * 24; const SEC_PER_WEEK:int = SEC_PER_DAY * 7; const SEC_PER_MONTH:int = SEC_PER_DAY * 30; const SEC_PER_YEAR:int = SEC_PER_MONTH * 12; // if now isn't defined, make it a new Date object (the present) if (!now) { now = new Date(); } // don't use secondsElapsed here because the values are // huge so they use uints and are never negative if (now.time < date.time) { return "in the future"; } // get the difference in seconds between the two values. var secondsElapsed:uint = Math.floor((now.time - date.time) / 1000); // seconds if (secondsElapsed < SEC_PER_MINUTE) { return "just now"; } // minutes if (secondsElapsed < SEC_PER_HOUR) { var minutes:int = int(secondsElapsed / SEC_PER_MINUTE); return formatAgoString(minutes, "minute"); } // hours if (secondsElapsed < SEC_PER_DAY) { var hours:int = int(secondsElapsed / SEC_PER_HOUR); return formatAgoString(hours, "hour"); } // days if (secondsElapsed < SEC_PER_WEEK) { var days:int = int(secondsElapsed / SEC_PER_DAY); if (days == 1) { return "yesterday"; } return formatAgoString(days, "day"); } // weeks if (secondsElapsed < SEC_PER_MONTH) { var weeks:int = int(secondsElapsed / SEC_PER_WEEK); return formatAgoString(weeks, "week"); } // months if (secondsElapsed < SEC_PER_YEAR) { var months:int = int(secondsElapsed / SEC_PER_MONTH); return formatAgoString(months, "month"); } // years return "more than a year ago"; // Returns a string in the format "count unit(s) ago" function formatAgoString(count:int, unit:String):String { return count + " " + unit + (count > 1 ? "s" : "") + " ago"; } }
Je vais essayer PrettyTime ( github ) en Java maintenant. Multi-langue et personnalisable.