Java Date and Time Date from ZonedDateTime UTC Instance

I have a Java application in which I would like time in UTC. The code currently uses a combination of java.util.Dateand java.sql.Timestamp. To get the time in UTC, the programmer in front of me used:

Date of:

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

To timestamp:

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

However, I myself performed several tests with this code, and both of these lines return the current date / time (in my current time zone). From everything I read, it appears that Date / Timestamp does not matter zoneOffset, but I cannot find a specific wording for this.

Is there a way to save timeZone (UTC) in Date or Timestamp objects, or do I need to do some refactoring and use the actual ZonedDateTime object during my application? Will this ZonedDateTime object also be compatible with the current Timestamp object for sql?

Example:

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);
}

Exit:

 ZonedDateTime: 2017-04-06T15:46:33.099Z
 Timestamp: 2017-04-06 10:46:33.109
 Date: Thu Apr 06 10:46:33 CDT 2017
+12
source share
3 answers

TL; dr

Instant.now()  // Capture the current moment in UTC with a resolution up to nanoseconds.

Use only java.time classes. Avoid the troubled old obsolete time classes added before Java 8.

Using java.time

Programmer, before you use the new java.time modern classrooms, which are now replacing the infamous old outdated time classes such as Date, Calendar, Timestamp.

Instant

Instant UTC ( (9) ). UTC : Instant.now.

Instant instant = Instant.now();

java.time . , , , java.time, / java.time. . java.util.Date Instant.

java.util.Date d = java.util.Date.from( myInstant); // To legacy from modern.
Instant instant = myJavaUtilDate.toInstant();  // To modern from legacy.

JDBC

. java.time.

JDBC 4.2 java.time, PreparedStatement::setObject ResultSet::getObject.

myPreparedStatement.setObject( … , instant ) ;

… …

Instant instant = myResultSet.getObject( … , Instant.class ) ;

, java.sql, . , .

myPreparedStatement.setTimestamp( … , java.sql.Timestamp.from( instant ) ) ;

… …

Instant instant = myResultSet.getTimestamp( … ).toInstant() ;

ZonedDateTime

, ZonedDateTime , UTC. Instant UTC. , , :

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

... :

Date.from( Instant.now() ) ;

, java.util.Date UTC. toString , JVM String. - , , Stack Overflow.

UTC Instant , ZoneId ZoneDateTime.

continent/region, , America/Montreal, Africa/Casablanca Pacific/Auckland. 3-4 , CDT EST IST , (!).

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdt = instant.atZone( z );

java.time

java.time Java 8 . , java.util.Date, Calendar SimpleDateFormat.

Joda-Time, , java.time.

, Oracle. Qaru . - JSR 310.

java.time . JDBC-, JDBC 4.2 . , java.sql.*.

java.time?

ThreeTen-Extra java.time . java.time. , Interval, YearWeek, YearQuarter .

+21

Java Date . . toString() Date, , . / 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);
+3

I created the SimpleJdbcUpdate class shown below:

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
source

Source: https://habr.com/ru/post/1016357/


All Articles