3

MySQL を使用していくつかの日付を保存しています。これらをユーザー インターフェイスで相対的な期間として表示しようとしています: 2 時間前、3 日前など (たとえば、Twitter が更新に対して行うように)

これを達成するためのよく知られた方法はありますか、それとも創造力を働かせる必要がありますか?

明確にするために、変換したい: 07/26/2009 12:20 -> '2 days ago'

4

8 に答える 8

4

あなたの問題を理解しているので、「ヒューマンタイム」クラスは解決策です。

HumanTime を使用した Java での人間のための日付の書式設定と解析を 確認してください。

于 2009-07-28T12:17:58.067 に答える
2

このタイプの日時演算を実行するための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.
于 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 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);
于 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 に答える