首页 > 解决方案 > 哪些日期类型是特定于时区的?

问题描述

我有一个特定于时区的日历对象。我想使用这个对象更新我的 sql server 表。但是,如果我在单元测试中使用日历对象,则会引发错误。我使用 hsqldb 以datetime列类型对其进行测试。

因此,我需要使用不同的类型来表示时间。我尝试使用Timestamp对象,它可以工作,但它不是特定于时区的。这是我的代码:

private SqlParameterSource getParameters(StudyEvent studyEvent) {
        MapSqlParameterSource parameters = new MapSqlParameterSource();
        parameters.addValue(STUDY_ID, studyEvent.getStudy().getId());
        parameters.addValue(STUDY_DATE, new Timestamp(getDate(studyEvent.getStudy().getStudyDate()).getTimeInMillis()));

//studyEvent.getStudy().getStudyDate() returns long value of time (epoch time)
}

private Calendar getDate(long time) {
        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
        calendar.setTimeInMillis(time);
        return calendar;
}

new Timestamp(.....)代码中,它不会是我需要的特定时区。我可以使用哪些其他Date类型的对象,以便将其转换Calendar并添加到具有特定时区的 sql server?

编辑:

我有一段代码使用准备好的语句,允许我像这样使用时间戳和时区:

private long insertStudy(StudyEvent event) {
        KeyHolder keyHolder = new GeneratedKeyHolder();

        int records = jdbcTemplate.getJdbcTemplate().update(connection -> {

            PreparedStatement statement = connection.prepareStatement(insertStudy, new String[] { STUDY_ID });
            int index = 1;
            statement.setTimestamp(index, new java.sql.Timestamp(Instant.now().toEpochMilli()), CALENDAR);
            return statement;
        }, keyHolder);
        return keyHolder.getKey().longValue();
    }

PreparedStatement.setTimestamp()看起来像是一个可能的解决方案,但我不知道如何使用PreparedStatementto SqlParameterSource..

标签: javasql-servertimestamp

解决方案


推荐阅读