web-dev-qa-db-ja.com

Java "yyyy-mm-dd HH:mm:ss"形式の文字列から日付へのオブジェクト

日付を含む文字列を日付オブジェクトに変換する必要があります。文字列の形式は「yyyy-mm-dd HH:mm:ss.SSSSSS」であり、日付オブジェクトでも同じ形式が必要です。

たとえば、文字列「2012-07-10 14:58:00.000000」があり、結果の日付オブジェクトが同じ形式である必要があります。

以下の方法を試してみましたが、結果は期待通りではありません。

Java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
                Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000");

結果は「Tue Jan 10 14:58:00 EST 2012」です。どこがおかしいのか教えてください。

ありがとう、イェシュワントコタ

23
Yeshwanth Kota
Java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");

mmは、必要な分ですMM

[〜#〜] code [〜#〜]

public class Test {

    public static void main(String[] args) throws ParseException {
        Java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS")
                .parse("2012-07-10 14:58:00.000000");
        System.out.println(temp);
    }
}

プリント:

2012年7月10日火曜日14:58:00 EDT 2012

49
Woot4Moo

将来の参考のために:

 yyyy => 4 digit year
 MM   => 2 digit month (you must type MM in ALL CAPS)
 dd   => 2 digit "day of the month"

 HH   => 2-digit "hour in day" (0 to 23)
 mm   => 2-digit minute (you must type mm in lowercase)
 ss   => 2-digit seconds
 SSS  => milliseconds

したがって、「yyyy-MM-dd HH:mm:ss」は「2018-01-05 09:49:32」を返します

しかし、「MMM dd、yyyy hh:mm a」は「Jan 05、2018 09:49 am」を返します

https://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html のいわゆる例では、出力のみが表示されます。どのフォーマットを使用するかは教えてくれません!

3
Ed Poor

日付フォーマッターを適用していない。むしろ、単に日付を解析しているだけです。この形式で出力を取得するには

yyyy-MM-dd HH:mm:ss.SSSSSS

ここでformat()メソッドを使用する必要があります。完全な例です。-完全な例です:-この形式のDateを取りますyyyy-MM-dd HH:mm:ss.SSSSSSそして結果として、このフォーマットと同じ出力が得られますyyyy-MM-dd HH:mm:ss.SSSSSS

 import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Date;

//TODO OutPut should LIKE in this format yyyy-MM-dd HH:mm:ss.SSSSSS.
public class TestDateExample {

public static void main(String args[]) throws ParseException {

    SimpleDateFormat changeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");

    Java.util.Date temp = changeFormat.parse("2012-07-10 14:58:00.000000");
     Date thisDate = changeFormat.parse("2012-07-10 14:58:00.000000");  
    System.out.println(thisDate);
    System.out.println("----------------------------"); 
    System.out.println("After applying formating :");
    String strDateOutput = changeFormat.format(temp);
    System.out.println(strDateOutput);

}

}

Working example screen

1
Vipul Gulhane

tl; dr

LocalDateTime.parse( 
    "2012-07-10 14:58:00.000000".replace( " " , "T" )  
)

マイクロ秒が合わない

マイクロ秒(6桁の10進数)の値を、ミリ秒の解像度(3桁の10進数)のみが可能なデータ型に絞り込もうとしています。それは不可能です。

代わりに、十分に細かい解像度のデータ型を使用してください。 Java.timeクラスはナノ秒の解像度(9桁の10進数)を使用します。

ゾーン化されていない入力はゾーン化された型に適合しません

UTCからの値のみを表すデータ型(Date)に、UTCからのオフセットまたはタイムゾーンがない値を配置しようとしています。したがって、入力ではない情報(UTCオフセット)を追加しています。

代わりに適切なデータ型を使用してください。具体的には、 Java.time.LocalDateTime

大文字と小文字を区別

その他の回答とコメントでは、フォーマットパターンコードでは大文字と小文字が区別されることを正しく説明しています。したがって、MMmmの効果は異なります。

レガシークラスを避ける

最も古いバージョンのJavaにバンドルされている面倒な古い日時クラスは、レガシーであり、Java 8以降に組み込まれたJava.timeクラスに取って代わりました。

ISO 8601

入力文字列は、ISO 8601標準形式にほぼ準拠しています。完全に準拠するには、中央のSPACEをTに置き換えます。

Java.timeクラスは、文字列の解析/生成時にデフォルトで標準形式を使用します。したがって、フォーマットパターンを指定する必要はありません。

日時オブジェクトには「フォーマット」がありません

結果の日付オブジェクトは同じ形式である必要があります。

いいえ、日時オブジェクトには「フォーマット」がありません。日付時刻オブジェクトを単なる文字列と混同しないでください。文字列は、オブジェクトの入力および出力です。オブジェクトは、日時情報の独自の内部表現を維持しますが、その詳細は、プログラマーの呼び出しとしては無関係です。

Java.time

入力には、UTCからのオフセットまたは問題のあるゾーンのインジケーターがありません。したがって、これらの概念を欠くLocalDateTimeオブジェクトとして解析します。

String input = "2012-07-10 14:58:00.000000".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;

文字列を生成する

LocalDateTimeの値を表す文字列を生成するには:

  • toStringを呼び出して、標準ISO 8601形式の文字列を取得します。
  • DateTimeFormatterを使用して、カスタム形式または自動ローカライズ形式のいずれかで文字列を生成します。

これらのトピックは既に何度も取り上げられているため、スタックオーバーフローで詳細を検索してください。

ZonedDateTime

LocalDateTimeは、タイムライン上の正確なポイントを表すnotを表します。

実際の瞬間を決定するには、タイムゾーンを割り当てます。たとえば、コルカタインドの正午は、フランスのパリの正午よりもはるかに早く来ます。時間帯のない正午は、約26〜27時間の範囲の任意の時点で発生する可能性があります。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

Java.timeについて

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

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

詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 31 です。

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

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

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および more

1
Basil Bourque

私の仕事SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); sdf.format(new Date));

0
Avinash Khadsan