3

我们使用 MySQL 来存储一些日期。我希望在用户界面中将这些显示为相对时间段:2 小时前、3 天前等(例如 Twitter 对更新所做的)

有没有一种众所周知的方法可以做到这一点,还是我应该发挥创意?

为了清楚起见,我想转换:07/26/2009 12:20 -> '2 天前'

4

8 回答 8

4

据我了解您的问题,“人力时间”课程是一个解决方案。

检查Date Formatting and Parsing for Humans in Java with HumanTime

于 2009-07-28T12:17:58.067 回答
2

我会看一下执行这种类型的日期时间算术的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.
于 2009-07-28T12:05:35.020 回答
2

用于日期计算的 Java 标准 API 方法是Calendar.add()(它也接受负参数)。

于 2009-07-28T12:08:58.087 回答
1

我认为最常见的解决方案是将其转换为 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;

或几个月(虽然,然后它开始变得棘手......),或任何你想使用的。

玩得开心。

于 2009-07-28T12:03:26.087 回答
1

我的建议是在UTC中运行您的服务器,然后使用JodaTime进行任何日期算术或时区之间的转换。

一旦您考虑到 DSL、闰秒、约定更改等因素,迄今为止的算术比看上去要多得多,而且这确实是您自己最不想做的事情。

于 2009-07-28T12:03:37.973 回答
1

这个问题比较模糊。

在 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);
于 2009-07-28T12:03:54.820 回答
0

如果您可以使用 java 进行转换,请查看Joda库。

于 2009-07-28T12:04:17.253 回答
0

在 MySQL 方面:

CONVERT('date-time-value-here', DATETIME) - NOW()
于 2009-07-28T12:08:00.773 回答