7

DateクラスとCalendarクラスを使用して、Javaの2つの日付/時刻の差を計算したいと思います。私が持っているフォーマットは「2012-01-2412:30:00PM」です。

私は自分のメソッドを実装し、他の人と連携するようにグーグルで検索しましたが、AM値とPM値を処理するための適切なヒントが得られていません。

時刻に12(AM / PM)が含まれていると、日付と時刻の差が問題になります。たとえば、日付/時刻が「2012-01-2412:30:00PM」と「2012-01-2402:30:00PM」の場合、差は10時間であることが示されます。

このリンクのコードを考慮すると、AMとPMを処理するようにどのように変更できますか。

文字列の日付を日付に変換するには、次のコードを使用します。

    String sessionTimeStart = "2012-01-24 12:30:00 PM";
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null;
    Date d0 = null; 
    try {
        d1 = format.parse(sessionTimeStart);
        d0 = format.parse(sessionTimerEndOrCurrent);
    } catch (ParseException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
4

6 に答える 6

8

問題はあなたの日付形式です:代わりにyyyy-MM-dd HH:mm:ss a使用しますyyyy-MM-dd hh:mm:ss a

HHは時間 (0-23)hhで、時間は AM/PM (1-12) です。したがって、日付形式 02:30:00 を使用すると、PM バージョン (1 日の時間で 14:30:00 になります) に変換されるのではなく、そのままとして解析されます。

于 2012-01-25T10:29:45.553 に答える
5

差が 10 時間と表示される理由は、入力を解析するときにパターンにエラーがあるためです。

を使用した例を次に示しSimpleDateFormatます。

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");

Date date1 = df.parse("2012-01-24 12:30:00 PM");
Date date2 = df.parse("2012-01-24 02:30:00 PM");

long differenceInHours = Math.abs(date1.getTime() - date2.getTime()) / 1000 / 60 / 60);

戻り10ます。

日付形式パターンをわずかに変更して、1 日の時間 (0-23)hhの代わりに午前/午後の時間 (1-12) を使用すると、次のようになります。HH

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

(予想される) を返します2

パターンを正しく取得するには、のドキュメントをSimpleDateFormat参照してください。

于 2012-01-25T10:35:03.690 に答える
4

それで、これらの日付を文字列として持っていますか? 適切なフォーマット文字列を使用してそれらを解析しSimpleDateFormat、時間の差を計算します。

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Date d1 = df.parse("2012-01-24 12:30:00 PM");
Date d2 = df.parse("2012-01-24 02:30:00 PM");

int hoursDifference = (int)((d2.getTime() - d1.getTime()) / 3600000L);
System.out.println("Difference in hours: " + hoursDifference);

エラーは、フォーマット文字列でhh (12 時間制) ではなくHH (24 時間制)を使用していることです。

于 2012-01-25T10:29:14.237 に答える
1

自分でビルドするのではなく、確立されたライブラリを使用してください。Jodatimeは広く使用されています。

于 2012-01-25T10:18:14.130 に答える
1

onsider Apache Commons DateUtils DurationFormatUtils formatPeriod メソッドを使用すると、魔法のようになります。

幸運を!

EDIT この時点で Date a と Date b が初期化されていると仮定すると、

String format="HH:mm:ss.SSS";   // whatever you wish
boolean padWithZeros=true; // whatever you wish
TimeZone timezone=null; // whatever you wish
long timeA = a.getTime();
long timeB = b.getTime();

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone);
于 2012-01-25T10:19:28.353 に答える
-1

Calendar には、減算にも使用できるメソッド add() があります。それを見てください。Date 操作のほとんどは非推奨であるため、Date の代わりに Calendar を使用する必要があります。

于 2012-01-25T10:20:21.400 に答える