【发布时间】:2020-06-01 09:55:36
【问题描述】:
我很累。我无法解决在 Java Spring 中迷路的一天的问题。 stackoverflow中有很多类似的问题,但没有一个对我有帮助。
我的 Spring 应用程序使用 java.time.LocalDate 包并接受来自前端日期字段的生日(react-datetime 组件)。采用 yyyy-mm-dd 格式。 Spring 使用 jdbc 将数据保存到 mysql 数据库中的表中。
保存到数据库中的生日作为一天丢失。例如用户输入 - 1998-04-12 那么它将被保存为 1998-04-11。这只发生几个月,从 11 月到 3 月的几个月正确保存到 DB,但其他月份丢失了一天。这既适用于创建用户,也适用于编辑用户。
代码如下:
...
import java.time.LocalDate;
public class UserInfo {
...
public LocalDate birthday;
}
...
@PreAuthorize("hasAnyAuthority('ADMIN_GROUP_EDIT, SPEC_USERS_EDIT, USERS_EDIT, REGISTRATION_DATA_EDIT')")
@RequestMapping(value = "/update/{id}", method = PUT)
public void update(HttpServletResponse response, HttpServletRequest request, @PathVariable Long id) {
User curUser = getUser();
log.info("Got update user request by user " + curUser);
log.info("For user id " + id);
String reqBody = Utils.toString(request);
if (reqBody == null) {
returnError(response, RestErrorCode.EMPTY_REQUEST);
return;
}
JsonElement body = new JsonParser().parse(reqBody);
JsonObject jsonObject = body.getAsJsonObject();
if (jsonObject == null) {
log.error(BAD_REQUEST_BODY_MESS);
return;
}
UserInfo info = null;
if (jsonObject.has("info")) {
String infoStr = jsonObject.get("info").toString();
info = GsonHelper.fromJson(infoStr, UserInfo.class);
}
userService.updateUserInfo(info);
...
@Transactional
public int updateUserInfo(UserInfo info) {
info.editorUserId = AuthProvider.getCurUserId();
return transactionTemplate.execute(status -> {
String update = "" +
"UPDATE USER_INFO " +
" SET first_name = COALESCE(:firstName, first_name), " +
" middle_name = COALESCE(:middleName, middle_name), " +
" last_name = COALESCE(:lastName, last_name), " +
" birthday = COALESCE(:birthday, birthday), " +
" address = COALESCE(:address, address)," +
" email = COALESCE(:email, email)," +
"WHERE id =:id";
return npDb.update(update, new FieldSqlParameterSource(info));
});
}
我调试了我的代码,后端正确地接受了用户的生日并使用了简单的 jdbc,但是我没有找到的老鼠在哪里。如何克服这个问题?
【问题讨论】:
-
11 月到 3 月是正确的,其余月份有 -1 天的问题?您的数据库中的时区设置是什么,您的计算机是什么?他们中的任何一个都应用夏令时吗?您是将日期存储为
DATE还是DATETIME或TIMESTAMP? -
如果本地日期 时间 是 yyyy-MM-dd 00:00 (HH:mm),那么对于夏令时,一小时的班次可能会导致前一天。 SQL DATE 与 'DATETIME 和 java 在 LocalDateTime 或旧日期上的时区的问题,
标签: java spring rest spring-mvc spring-data