java - 如何解决 Java Spring 中日期的一日偏移问题

标签 java spring rest spring-mvc spring-data

我很累。我无法解决 Java Spring 中丢失一天的问题。 stackoverflow上有很多类似的问题,但没有一个对我有帮助。

我的 Spring 应用程序使用 java.time.LocalDate 包并接受前端日期字段中的生日(react-datetime 组件)。采用 yyyy-mm-dd 格式。 Spring使用jdbc将数据保存到mysql数据库的表中。

将生日作为一天丢​​失保存到数据库中。例如用户输入 - 1998-04-12 那么它将被保存为 1998-04-11。这种情况仅在某些月份发生,从 11 月到 3 月的月份正确保存到数据库,但其他月份丢失了一天。这涉及到创建和编辑用户。

代码如下:

...
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,但是我没有找到老鼠在哪里。如何克服这个问题呢?

最佳答案

这看起来像是一个时区问题,特别是与夏令时有关的问题(欧洲国家的三月最后一个星期日到十月最后一个星期日)。检查计算机的时区设置、Java 环境和数据库服务器是否匹配。像生日这样的日期应该是 DATE 类型(而不是 TIMESTAMP)。

关于java - 如何解决 Java Spring 中日期的一日偏移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60262927/

相关文章:

java - 如何在需要关注时在 Windows 任务栏上闪烁 JFrame

java - 将 JPanel 添加到图形面板并使 JPanel 透明(对象除外)

spring - 在没有 Spring Boot 的情况下设置内存中的 H2 数据库

java - 使用SimpleBrokerMessageHandler时的通信关系 - STOMP Spring

java - 在集成测试之前运行主 springboot 应用程序

java - Spring REST 返回 PDF - 响应状态 406( Not Acceptable )

Java MVC DAO 实现出现 NullPointerException 错误

Java - 不实例化对象时是否需要 static 和 volatile?

java - 并发请求中rest api数据不匹配

java - 如何在scala akka(spray)中编写休息服务的测试用例