我们使用MySQL来存储一些日期。我希望将这些显示为用户界面中的相对时间段:2小时前,3天前等(例如,Twitter会更新更新)
有没有一种众所周知的方法可以实现这一目标,还是应该让它有创意呢?
为了清楚,我想改变: 07/26/2009 12:20 - > '2天前'
答案 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()