ホームページ  >  記事  >  データベース  >  UNIX タイムスタンプを変換するときに SimpleDateFormat.parse が予期しない出力を生成するのはなぜですか?

UNIX タイムスタンプを変換するときに SimpleDateFormat.parse が予期しない出力を生成するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 16:26:29708ブラウズ

Why Does SimpleDateFormat.parse Produce Unexpected Output When Converting UNIX Timestamps?

SimpleDateFormatter.parse からのさまざまな出力形式

Java プログラムでは、SimpleDateFormat クラスを利用して日付を指定された形式に変換します。ただし、場合によっては、SimpleDateFormatter.parse を使用して日付を解析すると、書式設定中に指定した形式とは異なる形式になる可能性があることが確認されています。

この問題は、UNIX タイムスタンプを日付文字列に変換するときに発生します。簡略化した例を次に示します。

<code class="java">String ep ="a1527069600";
Long epoch = Long.parseLong(ep.substring(1, ep.length()));
Date dt = new Date(epoch*1000L);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));

System.out.println("SDF.Format - "+sdf.format(dt));
System.out.println("SDF.parse - "+sdf.parse(sdf.format(dt)));</code>

この例では、sdf に指定された形式は「dd/MM/yyyy hh:mm:ss a」ですが、sdf.parse の出力は別の形式になります。 、「Wed May 23 15:30:00 IST 2018.」

解決策

この問題を解決するには、MySQL データベースに日付文字列を渡さないようにします。代わりに、日付オブジェクトを使用してください。 Java は、最新の日付と時刻を処理するための java.time API を提供します。特定のシナリオでは、LocalDateTime オブジェクトを使用できます。

<code class="java">    String ep ="a1527069600";
    long epoch = Long.parseLong(ep.substring(1));
    Instant inst = Instant.ofEpochSecond(epoch);
    LocalDateTime ldt = inst.atZone(ZoneId.of("Asia/Calcutta")).toLocalDateTime();

    PreparedStatement ps = myDatabaseConnection.prepareStatement(
            "insert into my_table (my_date_time) values (?)");
    ps.setObject(1, ldt);</code>

このアプローチにより、一貫した日付形式が確保され、SimpleDateFormatter.parse で発生する解析の問題が排除されます。

以上がUNIX タイムスタンプを変換するときに SimpleDateFormat.parse が予期しない出力を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。