web-dev-qa-db-ja.com

Java ZonedDateTime UTCのインスタンスからの日付とタイムスタンプ

Javaアプリケーションで、UTCの時刻が必要です。現在、コードではJava.util.DateおよびJava.sql.Timestamp。 UTCで時刻を取得するために、私の前のプログラマーは次のように使用しました。

日付の場合:

 Date.from(ZonedDateTime.now(ZoneOffset.UTC)).toInstant();

タイムスタンプの場合:

 Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());

しかし、このコードを使用して自分で複数のテストを実行し、これらの行は両方とも現在の日付/時刻を返します(現在のタイムゾーンで)。私がそれを読んだことすべてからappears Date/TimestampにはzoneOffset値はありませんが、これの具体的なステートメントは見つかりません。

とにかくTimeZone(UTC)をDateまたはTimestampオブジェクト内に保持する必要がありますか、またはアプリケーション全体で実際のZonedDateTimeオブジェクトをリファクタリングして使用する必要がありますか?また、このZonedDateTimeオブジェクトは、SQLの現在のTimestampオブジェクトと互換性がありますか?

例:

public static void main (String args[])
{
    ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
    Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
    Date date = Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
    System.out.println("ZonedDateTime: " + zonedDateTime);
    System.out.println("Timestamp: " + timestamp);
    System.out.println("Date: " + date);
}

出力:

 ZonedDateTime: 2017-04-06T15:46:33.099Z
 Timestamp: 2017-04-06 10:46:33.109
 Date: Thu Apr 06 10:46:33 CDT 2017
15

Javaでは、Dateは特定の時点を表します。タイムスタンプとは関係ありません。 DateオブジェクトのtoString()メソッドを呼び出すと、その時間をプラットフォームのデフォルトのタイムスタンプに変換します。以下は、UTCで日付/時刻を出力します(デフォルトのタイムゾーンをUTCに設定するため):

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
Date date = Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
System.out.println("ZonedDateTime: " + zonedDateTime);
System.out.println("Timestamp: " + timestamp);
System.out.println("Date: " + date);
5
Darshan Mehta

以下に示すSimpleJdbcUpdateクラスを作成しました。

public class SimpleJdbcUpdate {

private final JdbcTemplate jdbcTemplate;
private DataSource dataSource;
private String tableName;
private final TableMetaDataContext tableMetaDataContext = new TableMetaDataContext();
Map<String, ColumnInfo> propertyToColumnMap = new HashMap<>();
private boolean compiled;

public SimpleJdbcUpdate(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
    this.dataSource = dataSource;
}

private List<String> getColumnNames() {
    return Collections.emptyList();
}

private String[] getGeneratedKeyNames() {
    return new String[0];
}

public SimpleJdbcUpdate withTableName(String tableName) {
    this.tableName = tableName;
    return this;
}

public int execute(BeanPropertySqlParameterSource parameterSource, String[] keys) {

    if (!compiled) {
        compile();
    }

    return doExecute(parameterSource, keys);
}

private int doExecute(BeanPropertySqlParameterSource parameterSource, String[] keys) {
    String[] propertyNames = parameterSource.getParameterNames();

    List<Object> values = new ArrayList<>();
    String updateSql = updateSql(parameterSource, propertyNames, values);
    String wherePart = wherePart(parameterSource, keys, values);

    String updateSqlWithWhere = updateSql + wherePart;
    return jdbcTemplate.update(updateSqlWithWhere, values.toArray());
}

private String updateSql(BeanPropertySqlParameterSource parameterSource, String[] propertyNames, List<Object> values) {
    StringBuilder updateSqlBuilder = new StringBuilder("update " + tableName + " set ");
    boolean first = true;
    for (String propertyName : propertyNames) {
        ColumnInfo columnInfo = propertyToColumnMap.get(propertyName);
        if (columnInfo == null) {
            continue;
        }

        addValue(parameterSource, values, propertyName);

        if (!first) {
            updateSqlBuilder.append(", ");
        }
        updateSqlBuilder.append(columnInfo.columnName + " = ?");
        first = false;
    }
    return updateSqlBuilder.toString();
}

private String wherePart(BeanPropertySqlParameterSource parameterSource, String[] keys, List<Object> values) {
    StringBuilder wherePartBuilder = new StringBuilder();
    boolean first = true;
    for (String key : keys) {
        ColumnInfo columnInfo = propertyToColumnMap.get(key);
        if (columnInfo == null) {
            continue;
        }

        addValue(parameterSource, values, key);

        if (first) {
            wherePartBuilder.append(" WHERE ");
        } else {
            wherePartBuilder.append(" AND ");
        }
        wherePartBuilder.append(columnInfo.columnName + " = ?");

        first = false;
    }
    return wherePartBuilder.toString();
}

private void addValue(BeanPropertySqlParameterSource parameterSource, List<Object> values, String propertyName) {
    if (parameterSource.hasValue(propertyName)) {
        Object typedValue = SqlParameterSourceUtils.getTypedValue(parameterSource, propertyName);
        if (typedValue.getClass().isEnum()) {
            typedValue = new SqlParameterValue(Types.VARCHAR, ((Enum) typedValue).name());
        }
        values.add(typedValue);
    }
}

private void compile() {
    tableMetaDataContext.setTableName(tableName);
    this.tableMetaDataContext.processMetaData(dataSource, getColumnNames(), getGeneratedKeyNames());

    List<String> tableColumns = tableMetaDataContext.getTableColumns();
    for (int i = 0; i < tableColumns.size(); i++) {
        String column = tableColumns.get(i);
        String propertyName = JdbcUtils.convertUnderscoreNameToPropertyName(column);
        propertyToColumnMap.put(propertyName, new ColumnInfo(column, i));
    }

    compiled = true;
}

private static class ColumnInfo {
    String columnName;
    Integer index;

    public ColumnInfo(String columnName, Integer index) {
        this.columnName = columnName;
        this.index = index;
    }
  }
}
0