我们使用 MySQL 来存储一些日期。我希望在用户界面中将这些显示为相对时间段:2 小时前、3 天前等(例如 Twitter 对更新所做的)
有没有一种众所周知的方法可以做到这一点,还是我应该发挥创意?
为了清楚起见,我想转换:07/26/2009 12:20 -> '2 天前'
我们使用 MySQL 来存储一些日期。我希望在用户界面中将这些显示为相对时间段:2 小时前、3 天前等(例如 Twitter 对更新所做的)
有没有一种众所周知的方法可以做到这一点,还是我应该发挥创意?
为了清楚起见,我想转换:07/26/2009 12:20 -> '2 天前'
据我了解您的问题,“人力时间”课程是一个解决方案。
检查Date Formatting and Parsing for Humans in Java with HumanTime 。
我会看一下执行这种类型的日期时间算术的Joda库。例如,您可以创建一个 Joda Duration
,然后将其转换为 a Period
,让您可以访问许多有用的方法:
ResultSet rs = ...
Date dbDate = rs.getDate("Date"); // Get stored time in database.
long serverTime = System.currentTimeMillis(); // Get current server time.
// Compute absolute difference between two time-stamps.
Duration duration = new Duration(Math.abs(serverTime - dbDate.getTime()));
// Convert to period and make use of getHours(), getMinutes(), etc for display purposes.
Period period = duration.toPeriod();
System.err.println("Hours: " + period.getHours());
System.err.println("Minutes: " + period.getMinutes()); // etc.
用于日期计算的 Java 标准 API 方法是Calendar.add()(它也接受负参数)。
我认为最常见的解决方案是将其转换为 unix 时间戳(或等效的,通常为 Java 中的毫秒),取其差异并开始划分。
time = now - then;
time /= 1000; /* if milliseconds... */
seconds = time % 60; time /= 60;
minutes = time % 60; time /= 60;
hours = time % 60; time /= 60;
days = time % 24; time /= 24;
weeks = time % 7; time /= 7;
或几个月(虽然,然后它开始变得棘手......),或任何你想使用的。
玩得开心。
这个问题比较模糊。
在 Java 中,使用 JodaTime 日期 API;
3天前:
DateTime date = new DateTime();
DateTime threeDA = date.plusDays(-3);
int daysBetween = Days.daysBetween(dbDate, threeDA).getDays();
int monthsBetween = Months.monthsBetween(dbDate, threeDA).getMonths();
或者您可以使用 JodaTime Period/Duration 对象。
在 MySQL 中,使用内置的MySQL 日期函数,例如:
SELECT SUBTIME(SYSDATE(),'3'); -- untested, no MySQL to hand
SELECT SUBTIME('2007-12-31 23:59:59.999999','3 0:0:0.000000');
对于日期差异:
SELECT DATEDIFF(columnname, SYSDATE()); -- Days since
SELECT TIMEDIFF(columnname, SYSDATE()); -- Time since
在 Java 中,使用公历:
GregorianCalendar threeDA = new GregorianCalendar();
threeDA.add(GregorianCalendar.DAY_OF_YEAR, -3);
如果您可以使用 java 进行转换,请查看Joda库。
在 MySQL 方面:
CONVERT('date-time-value-here', DATETIME) - NOW()