为了完整起见,这里提供一个使用lambda表达式和方法引用的解决方案:
ISO格式?
描述:
以下方法
- 将按照模式
yyyy-MM-dd
的String
转换为Timestamp
,如果输入有效,则返回一个时间戳。
- 如果给定
null
值,则返回null
。
- 如果给定无效输入,则抛出
DateTimeParseException
异常
代码:
static Timestamp convertStringToTimestamp(String strDate) {
return Optional.ofNullable(strDate)
.map(str -> LocalDate.parse(str).atStartOfDay())
.map(Timestamp::valueOf)
.orElse(null);
}
验证:
这种方法可以使用以下单元测试进行测试:
(使用Junit5和Hamcrest)
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
String strDate = "2020-01-30";
final Timestamp result = convertStringToTimestamp(strDate);
final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
assertThat(dateTime.getYear(), is(2020));
assertThat(dateTime.getMonthValue(), is(1));
assertThat(dateTime.getDayOfMonth(), is(30));
}
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenInvalidInput() {
String strDate = "7770-91-30";
assertThrows(DateTimeParseException.class, () -> convertStringToTimestamp(strDate));
}
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenNullInput() {
final Timestamp result = convertStringToTimestamp(null);
assertThat(result, is(nullValue()));
}
另一种格式?
通常,需要解析的字符串会以另一种格式出现。一种处理方式是使用格式化程序将其转换为另一种格式。以下是一个示例:
输入:20200130 11:30
模式:yyyyMMdd HH:mm
输出:此输入的时间戳
代码:
static Timestamp convertStringToTimestamp(String strDate) {
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm");
return Optional.ofNullable(strDate)
.map(str -> LocalDateTime.parse(str, formatter))
.map(Timestamp::valueOf)
.orElse(null);
}
测试:
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
String strDate = "20200130 11:30";
final Timestamp result = convertStringToTimestamp(strDate);
final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
assertThat(dateTime.getYear(), is(2020));
assertThat(dateTime.getMonthValue(), is(1));
assertThat(dateTime.getDayOfMonth(), is(30));
assertThat(dateTime.getHour(), is(11));
assertThat(dateTime.getMinute(), is(30));
}
.statement.setTimestamp(19,timestamp);
时,它会出现以下错误:"在将 nvarchar 数据类型转换为 datetime 数据类型时,值超出范围。" - Dimitra Micha