1

次のコードを作成して、2 つの異なる形式になる可能性のある 2 つのタイムスタンプ間の期間を計算します。

public class dummyTime {
public static void main(String[] args) {
    try {
        convertDuration("2008-01-01 01:00 pm - 01:56 pm");
        convertDuration("2008-01-01 8:30 pm - 2008-01-02 09:30 am");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static String convertDuration(String time) throws Exception {
    String ts[] = time.split(" - ");
    SimpleDateFormat formatNew = new SimpleDateFormat("HH:mm");
    Date beg, end;
    String duration = null;

    beg = getDateTime(ts[0]);
    end = getDateTime(ts[1], beg);

    duration = formatNew.format(end.getTime() - beg.getTime());
    System.out.println(duration + " /// " + time + " /// " + beg + " /// "
            + end);

    return duration;
}

private static Date getDateTime(String dateTime) throws ParseException {
    DateFormat formatOldDateTime = new SimpleDateFormat(
            "yyyy-MM-dd hh:mm aa");
    DateFormat formatOldTimeOnly = new SimpleDateFormat("hh:mm aa");
    Date date = null;

    try {
        date = formatOldDateTime.parse(dateTime);
    } catch (ParseException e) {
        date = formatOldTimeOnly.parse(dateTime);
    }

    return date;
}

private static Date getDateTime(String dateTime, Date orig)
        throws ParseException {
    Date end = getDateTime(dateTime);

    if (end.getYear() == 70) {
        end.setYear(orig.getYear());
        end.setMonth(orig.getMonth());
        end.setDate(orig.getDate());
    }

    return end;
}
}

生成される出力は次のとおりです。

01:56 /// 2008-01-01 01:00 pm - 01:56 pm /// Tue Jan 01 13:00:00 CET 2008 /// Tue Jan 01 13:56:00 CET 2008
14:00 /// 2008-01-01 8:30 pm - 2008-01-02 09:30 am /// Tue Jan 01 20:30:00 CET 2008 /// Wed Jan 02 09:30:00 CET 2008

私の質問は次のとおりです。

  1. 結果が常に間違っているのはなぜですか (常に +1h)?
  2. 日付のないタイムスタンプを識別するより良い方法は何ですか? == 70 は見栄えが悪く、getDay および setDay 関数も非推奨です。

どうもありがとう、この問題は私を数時間夢中にさせていました。

4

4 に答える 4

4

時間と分の数ではなく、時刻をフォーマットしています。冬の CET タイムゾーン [中央ヨーロッパ時間] にいるため、UTC (「GMT」) とは 1 時間異なります。

Calendarの代わりに使用することをお勧めしますDate。またはJoda-Time

于 2009-01-25T16:02:09.243 に答える
2
  1. 私のコンピューターでは、これは 2 時間ずれています。なぜなら、私は GMT+2 にいて、あなたはおそらく GMT+1 にいるからです。日付を受け取ることに注意してformatNew.format(end.getTime() - beg.getTime());ください。つまり、56 分を 1970-01-01-00:56:00 GMT+1 として扱います。これをすばやく修正するには、電話してくださいformatNew.setTimeZone( TimeZone.getTimeZone( "GMT" ) );

  2. 2 番目の項目では、format-yyyy-MM-dd が失敗した (解析エラーをキャッチした) かどうかを確認できます。これにより、年がないことがわかります。

于 2009-01-25T16:03:20.690 に答える
1

簡単な答え: SimpleDateFormat を使用して、日付なしで時刻を表す値をフォーマットするのは不適切です。

より長い答え: Java 時間の値は、「エポック」(UTC 1970 年 1 月 1 日の午前 0 時) からのミリ秒数です。

SimpleDateFormat は、有効なタイムスタンプが与えられていると想定し、ローカライズされた変換を日付と時刻に適用します。あなたのロケールは GMT (大陸ヨーロッパ) から 1 時間ずれていると思われます。そのため、1 時間ずれている結果が表示されます。

タイムゾーン GMT を設定することで SimpleDateFormat をだますことができますが、明示的な計算を使用して期間を表示する方がよいでしょう。

int duration = 90;
System.out.printf("%02d:%02d", duration / 60, duration % 60);
于 2009-01-25T16:06:39.703 に答える