java - 哪些日期类型是特定于时区的?
问题描述
我有一个特定于时区的日历对象。我想使用这个对象更新我的 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()
看起来像是一个可能的解决方案,但我不知道如何使用PreparedStatement
to SqlParameterSource
..
解决方案
推荐阅读
- reactjs - 没有在 componentDidMount 中调用 Curried 函数
- spring-boot - 春季数据JPA搜索忽略单词顺序
- gmail-api - 如何使用 Gmail API 从委托帐户发送电子邮件
- sql - 在循环 SQL 查询中捕获多个错误
- c# - WebJobs 中的 IConfiguration
- python - PyList_New 的链接器错误
- css - MiniCssExtractPlugin 相对于 ExtractTextPlugin 的优势?
- docker - 我可以同时运行 Kubernetes 和 Swarm 吗?
- mysql - 正确查询以获取 7 天中前 5 天的平均值?
- c# - 当用户从该单元格更改值时更新单元格值