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
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);
以下に示す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;
}
}
}