MySQL を使用していくつかの日付を保存しています。これらをユーザー インターフェイスで相対的な期間として表示しようとしています: 2 時間前、3 日前など (たとえば、Twitter が更新に対して行うように)
これを達成するためのよく知られた方法はありますか、それとも創造力を働かせる必要がありますか?
明確にするために、変換したい: 07/26/2009 12:20 -> '2 days ago'
MySQL を使用していくつかの日付を保存しています。これらをユーザー インターフェイスで相対的な期間として表示しようとしています: 2 時間前、3 日前など (たとえば、Twitter が更新に対して行うように)
これを達成するためのよく知られた方法はありますか、それとも創造力を働かせる必要がありますか?
明確にするために、変換したい: 07/26/2009 12:20 -> '2 days ago'
あなたの問題を理解しているので、「ヒューマンタイム」クラスは解決策です。
HumanTime を使用した Java での人間のための日付の書式設定と解析を 確認してください。
このタイプの日時演算を実行するためのJodaライブラリを見てみましょう。たとえば、 JodaDuration
を作成してから に変換すると、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 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 日付関数を使用します。
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()