2017-11-13 2 views
0

2つのtimestampオブジェクトがあります。Javaの2つのタイムスタンプオブジェクト間の年数を取得します。

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("1800-01-01 00:00:00.0"); 
System.out.println(timestamp); 

Timestamp ctimestamp = new Timestamp(System.currentTimeMillis()); 
System.out.println(ctimestamp); 
System.out.println(ctimestamp.getYear() - timestamp.getYear()); 

出力:それは動作し、ここでの問題は、getYear()は廃止されている217の適切な値を与える

1800-01-01 00:00:00.0 
2017-11-13 11:42:44.56 
217 

私はそれを得るための他の方法はありませんので、私は非推奨の警告を受け取りませんか?

+0

カレンダークラス、またはlocaldateを使用してみましたか? – dan6657

+1

@ dan6657、最初のタイムスタンプはDBから来ます。したがって、上記のスニペットはテスト目的のみです。差分を取得するために新しい現在のタイムスタンプを作成する必要があります – Yakhoob

+0

[期間と期間](https://docs.oracle.com/javase/tutorial/datetime/iso/period.html) – AxelH

答えて

1

使用Calendarクラス:

Timestamp timestamp = Timestamp.valueOf("1800-01-01 00:00:00.0"); 

    Timestamp ctimestamp = new Timestamp(System.currentTimeMillis()); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(timestamp); 

    int firstYearValue = calendar.get(Calendar.YEAR); 

    calendar.setTime(ctimestamp); 
    int secondYearValue = calendar.get(Calendar.YEAR); 

    int diff = secondYearValue - firstYearValue; 
    System.out.println(diff); 
+0

これは正しいです。魅力のように動作します! – Yakhoob

+1

正直言ってみましょうuldは今日のデフォルト選択として 'Calendar'を使用しません。' java.time'をチェックしてください。 – AxelH

+0

私は@AxelHに同意します。多くの場合、私はjoda時間を使用しますが、ここで目的はJavaの日付時間の問題に深く関与していないが、それは即時のケースを解決することであったと私は感謝します –

2

APIのjava.time

は、我々は簡単にTimestamp.toLocalDateTime()を使用してLocalDateTimejava.sql.Timestampを変換することができます。

LocalDateTimeから、LocalDateTime.toLocalDate()を使用してLocalDateを抽出することができます。

LocalDateとなったので、Periodを使用できます。完全な説明は、Oracleで提供されています:Period and Duration

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("1800-01-01 00:00:00.0"); 
java.time.LocalDate lDate = timestamp.toLocalDateTime().toLocalDate(); 

java.time.Period prd = java.time.Period.between(lDate, java.time.LocalDate.now()); 

System.out.println("Years : " + prd.getYears()); 
System.out.println("Month : " + prd.getMonths()); 
System.out.println("Days : " + prd.getDays()); 

そして、ここであなたは今日の日付(2017年11月13日)Ole V.Vによって示唆されるように

​​

に持って、あなただけの特定のフィールドが必要な場合は、

java.time.temporal.ChronoUnit.YEARS.between(
     timestamp.toLocalDateTime(), 
     java.time.LocalDateTime.now() 
) 

注:あなたはChronoUnitなどを使用することができます私は、これは衝撃的であるならば、私に知らせてください、私のクラスのためにここに絶対パスを使用しました、私はこれをもっと読みやすくするためにきれいにするでしょう。

+1

これに感謝します。 – Yakhoob

+1

'java.time'を推奨しています。オペレーションが数年ではなく数年しか関心がない場合は、ChronoUnit.YEARS.between(Timestamp.valueOf( "1800-01-01 00:00:00.0")。toLocalDateTime()、LocalDateTimeを使用する方が簡単かもしれません。今()) '。さらに、データベースから最新のクラス( 'LocalDateTime'または' Instant')のインスタンスにデータを取得し、時代遅れの 'Timestamp'クラスを使って完全にドロップする方が良いでしょう。 –

+1

@ OleV.V。ご意見をいただきありがとうございます。私は必要以上の完全な例を含んでいましたが、私は「ChronoUnit」にも短いものを含めました。 2番目の部分( 'Timestamp'を全く使わないでください)では、私はそのパスで始まらないことを好みました。私はまだサポートされているものを確認する機会がありませんでしたので、正確に可能なことがわかりません。 – AxelH

関連する問題