web-dev-qa-db-ja.com

Java=の日付オブジェクト形式からミリ秒を削除する方法

Java.util.Dateオブジェクトは日付を2014-01-24 17:33:47.214として保存しますが、日付の形式は2014-01-24 17:33:47が必要です。 ミリ秒の部分を削除したい

自分の質問に関連する質問をチェックしました...

Dateオブジェクトのサブ秒部分を削除する方法

私は与えられた答えを試しました

long time = date.getTime();
date.setTime((time / 1000) * 1000);

しかし、結果の日付形式は2014-01-24 17:33:47.0です。日付形式から0を削除するにはどうすればよいですか?

14
Ankit Lamba

基本的な答えは、できません。 Date#toStringによって返される値はDateオブジェクトの表現であり、toStringメソッドで内部的に使用する以外の形式の概念はありません。

通常、これは表示目的には使用しないでください(まれな場合を除く)

代わりに、ある種の DateFormat を使用する必要があります

例えば...

Date date = new Date();
System.out.println(date);
System.out.println(DateFormat.getDateTimeInstance().format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date));

次のようなものを出力します...

Thu Jan 30 16:29:31 EST 2014
30/01/2014 4:29:31 PM
30/01/14 4:29 PM
30/01/2014 4:29:31 PM
30 January 2014 4:29:31 PM

あなたが本当に行き詰まっている場合は、 SimpleDateFormat を使用してさらにカスタマイズできますが、すべての人が同じ日付/時刻形式を使用しているわけではないので、できればこれを避けます;)

10
MadProgrammer

tl; dr

小数秒をロップします。

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .truncatedTo( ChronoUnit.SECONDS )   // Generate new `Instant` object based on the values of the original, but chopping off the fraction-of-second.

Stringを生成するときに、小数秒を非表示にします。

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .atOffset( ZoneOffset.UTC )          // Return a `OffsetDateTime` object. 
              .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ). // Ask the `OffsetDateTime` object to generate a `String` with text representing its value, in a format defined in the `DateTimeFormatter` object.

従来の日時クラスを避ける

Java.timeクラスに取って代わった、古いレガシーの古い日時クラスを使用しています。

Instant

古いクラスに追加された新しいメソッドを呼び出して、古いJava.util.DateオブジェクトをJava.time.Instantに変換します。

Instant instant = myJavaUtilDate.toInstant() ;

Table of types of date-time classes in modern Java.time versus legacy.

切り捨て

データ自体の値を変更して秒の端数を切り捨てたい場合は、切り捨てることができます。 Java.timeクラスは 不変オブジェクト を使用するため、元のオブジェクトを変更(変更)するのではなく、新しいオブジェクトを生成します。

Instant instantTruncated = instant.truncatedTo( ChronoUnit.SECONDS );

文字列を生成しています

切り捨てるのではなく、日付時刻値を表す文字列を生成するときに小数秒の表示を抑制したいだけの場合は、ニーズに合うようにフォーマッタを定義します。

たとえば、「uuuu-MM-dd HH:mm:ss」は小数秒について言及していないため、データに含まれるミリ秒は、生成された文字列には表示されません。

より柔軟な書式設定のために、InstantOffsetDateTimeに変換します。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC )
String output = odt.format( f );

タイムゾーン

あなたの質問はタイムゾーンの問題を無視することに注意してください。 UTCを使用するつもりなら、上記のコードはDateInstantの両方が定義によりUTCにあるので機能します。代わりに、特定の地域の ウォールクロック時間 のレンズを通して特定のデータを認識したい場合は、タイムゾーンを適用します。詳細については、スタックオーバーフローでZoneIdおよびZonedDateTimeクラス名を検索してください。


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古い レガシーに取って代わりますJava.util.DateCalendar 、& SimpleDateFormat などの日時クラス.

Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用します。文字列も、Java.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 IntervalYearWeekYearQuartermore などの便利なクラスがここにあります。

20
Basil Bourque

SimpleDateFormatterを使用できます。次のコードをご覧ください。

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
Date now = date.getTime();
System.out.println(formatter.format(now));
5
Mayur

ApacheのDateUtilsを使用します。

import org.Apache.commons.lang.time.DateUtils;
...
DateUtils.truncate(new Date(), Calendar.SECOND)
4
Scott White

秒に切り捨て(ミリ秒なし)、新しい日付を返します。

public Date truncToSec(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.MILLISECOND, 0);
    Date newDate = c.getTime();
    return newDate;
}
0
gene b.

SimpleDateFormatクラスを使用して、必要に応じて日付をフォーマットできます。可能な組み合わせの多様性のため、ここにドキュメントのリンクを単に含めます:

http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

コードは次のようになります。

System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(date));
0
John Bergman

参考までに、 リンクした投稿 で受け入れられた回答は機能します:

public static void main(String[] args) {
       SimpleDateFormat df = new SimpleDateFormat("S");
       Date d = new Date();
       System.out.println(df.format(d));
       Calendar c = Calendar.getInstance();
       c.set(Calendar.MILLISECOND, 0);
       d.setTime(c.getTimeInMillis());
       System.out.println(df.format(d));

}
0
Bernat