sql >> データベース >  >> RDS >> Mysql

JavaでエポックをmySQLタイムスタンプに変換する方法

    java.time

    2014年3月のJavaSE8のリリースにより、古くてエラーが発生しやすいレガシーDate-Time API(java.util 日時タイプとそのフォーマットタイプ、SimpleDateFormat など)はjava.timeに置き換えられました 、最新の日時API。 次の表 java.timeを使用したANSISQLタイプのマッピングを示しています タイプ:

    ANSI SQL Java SE 8
    日付 LocalDate
    時間 LocalTime
    タイムスタンプ LocalDateTime
    TIME WITH TIMEZONE ResetTime
    タイムスタンプ付きタイムスタンプ ResetDateTime

    ZonedDateTimeに注意してください およびInstant JDBCドライバーではサポートされていませんが、一部のドライバー(例: PostgreSQLはOffsetTimeもサポートしていません / TIME [ WITHOUT TIMEZONE ] 。また、すべてのOffsetDateTime インスタンスはUTCである必要があります(オフセット0)。これは、バックエンドがそれらをUTCとして保存するためです。

    JDBCでの使用方法は?

    以下に、現在のOffsetDateTimeを挿入するためのサンプルコードを示します。 UTCで、columnfooに (これはTIMESTAMP WITH TIMEZONE タイプ):

    OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
    PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
    st.setObject(1, odt);
    st.executeUpdate();
    st.close();
    

    Instant タイムライン上の瞬間的なポイントを表し、タイムゾーンに依存しません。つまり、+00:00のタイムゾーンオフセットがあります。 時間。

    以下に、OffsetDateTimeを取得するためのサンプルコードを示します。 columnfooから :

    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
    while (rs.next()) {
        // Assuming the column index of columnfoo is 1
        OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
        System.out.println(odt);
    }
    rs.close();
    st.close();
    

    OffsetDateTimeを変換する必要がある場合に備えて オフセットが異なる別のものに:

    これを行うにはいくつかの方法がありますが、私は主に OffsetDateTime#withOffsetSameInstant OffsetDateTimeを変換します タイムゾーンオフセットが異なる別のタイムゾーンに変換します。例:

    import java.time.Instant;
    import java.time.OffsetDateTime;
    import java.time.ZoneId;
    import java.time.ZoneOffset;
    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            // A sample OffsetDateTime in UTC.
            OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
            System.out.println(odt);
    
            OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
            System.out.println(offsetTimeAtOffset0100);
    
            // Time at JVM's default timezone offset
            ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
            OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
            System.out.println(offsetTimeAtJvmTzOffset);
        }
    }
    

    出力:

    2021-05-29T13:36:15.258076Z
    2021-05-29T15:36:15.258076+02:00
    2021-05-29T14:36:15.258076+01:00
    

    上記のコードに関連するいくつかのポイント:

    1. Z 出力には、タイムゾーン指定子 が含まれています。 ゼロタイムゾーンオフセットの場合。 Zuluの略で、Etc/UTCを指定します。 タイムゾーン(+00:00のタイムゾーンオフセットがあります 時間)。
    2. コードはodtを変換します OffsetDateTimeの2つのインスタンスに -それぞれ異なる方法で。最初のインスタンスは、+02:00の固定タイムゾーンオフセットです。 2つ目は、JVMのタイムゾーンオフセットを使用します。 DST を監視している場所のタイムゾーンオフセットに注意してください。 夏/冬時間に応じて変化します。したがって、場所がDSTを監視している場合、固定のタイムゾーンオフセットを使用する代わりに、 +02:00 時間; APIから取得する必要があります。
    3. 私のJVMのタイムゾーンはEurope/London 現在、そのオフセットは+01:00です。 時間。

    最新の日時API Trail:DateTime から



    1. GROUPBYを使用してSQLServerで文字列を連結するにはどうすればよいですか?

    2. MariaDBでのDATE()のしくみ

    3. ANSIJOINクエリと非ANSIJOINクエリのパフォーマンスは異なりますか?

    4. postgresqlデータベースに画像を挿入します