Java:日期和时间相对于当前(服务器)时间的时间

时间:2009-07-28 11:56:35

标签: java mysql date relative-date

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

有没有一种众所周知的方法可以实现这一目标,还是应该让它有创意呢?

为了清楚,我想改变: 07/26/2009 12:20 - > '2天前'

8 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

我会看一下Joda库来执行这种类型的日期时算术。例如,您可以创建一个Joda Duration,然后将其转换为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.

答案 2 :(得分:2)

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

答案 3 :(得分: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;

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

玩得开心。

答案 4 :(得分:1)

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

一旦你考虑到DSL,闰秒,常规变化等因素,那么迄今为止的算术要远远超过眼睛,这是你想要自己做的最后一件事。

答案 5 :(得分:1)

这个问题很模糊。

在Java中,使用JodaTime Date 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 Date Function例如:

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);

答案 6 :(得分:0)

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

答案 7 :(得分:0)

在MySQL方面:

CONVERT('date-time-value-here', DATETIME) - NOW()