4

の年を設定しようとしていjava.util.Dateます。

解析する必要があるタイムスタンプには年が含まれていないため、次のようにしました。

private static final SimpleDateFormat logTimeStampFormat = 
    new SimpleDateFormat("MMM dd HH:mm:ss.SSS");

boolean isAfterRefDate (String line, Date refDate) {        
    try {
        Date logTimeStamp = logTimeStampFormat.parse(line);
        logTimeStamp.setYear(2012);      // But this is deprecated!
        return logTimeStamp.after(refDate);
    } catch (ParseException e) {
        // Handle exception
    }        
}

非推奨の方法を使用しないようにするために、私は次のようにします。

private static final SimpleDateFormat logTimeStampFormat = 
    new SimpleDateFormat("MMM dd HH:mm:ss.SSS");

private static Calendar cal = Calendar.getInstance();

boolean isAfterRefDate (String line, Date refDate) {
    try {
        Date logTimeStamp = logTimeStampFormat.parse(line);
        cal.setTime(logTimeStamp);
        cal.set(Calendar.YEAR, 2012);
        logTimeStamp = cal.getTime();            
        return logTimeStamp.after(refDate);
    } catch (ParseException e) {
        // Handle exception
    }        
}

これがこの問題を解決する最善の方法だとは思いません。最初にカレンダー オブジェクトを適切に設定してから、そこから日付オブジェクトを取得する必要がありますが、以前は日付オブジェクトを直接変更するだけで済みました。

誰かがより良いアプローチを提案できますか?

4

2 に答える 2

5

誰かがより良いアプローチを提案できますか?

確かに-そもそも使用Dateを避けるようにしてください。代わりにJodaTimeCalendarを使用してください。これははるかに優れています。

年をaに設定することDateは、本質的にあいまいな操作です。今年はどのタイムゾーンを意味するのでしょうか。2012年2月29日の前の日付に2013年を設定すると、どうなると思いますか?

Joda Timeを使用すると、実際に期待しているデータの種類に関して、コードがはるかに明確になります。本当に必要な場合は、いつでもAPI境界Dateとの間で変換できます。Calendar

于 2012-08-15T09:23:42.717 に答える
1

java.time

誰かがより良いアプローチを提案できますか?

はい、java.timeクラスを使用します。

Jon Skeetの回答は正しかったのですが、Joda-Time チームが java.time クラスへの移行を勧めているため、現在は古くなっています。

MonthDay&LocalTime

その入力文字列を 2 つの別個のオブジェクト aMonthDayと aとして解析できますLocalTime。最初のものは明らかに月と日ですが、年がないため完全な日付ではありません。2 番目は時刻を表しますが、日付もタイムゾーンもありません。

String input = "Sep 21 12:34:56.123";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM dd HH:mm:ss.SSS" );

MonthDay md = MonthDay.parse ( input , f );
LocalTime lt = LocalTime.parse ( input , f );

System.out.println ( "md: " + md + " | lt: " + lt );

md: --09-21 | た: 12:34:56.123

LocalDateTime

1 年足して、全体をかき混ぜてLocalDateTime.

LocalDateTime ldt = LocalDateTime.of( ld , lt );

ZonedDateTime

これはまだ実際の瞬間ではなく、タイムライン上のポイントでもありません。UTC からのオフセットまたはタイム ゾーンのコンテキストがなければ、aLocalDateTimeは意味を持ちません。

a を適用して aZoneIdを取得しZonedDateTimeます。今、私たちは意味のある瞬間、タイムライン上のポイントを持っています.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
于 2016-09-20T02:44:24.990 に答える