【问题标题】:How to resolve one day offset problem for a date in Java Spring如何解决Java Spring中日期的一日偏移问题
【发布时间】: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 还是DATETIMETIMESTAMP
  • 如果本地日期 时间 是 yyyy-MM-dd 00:00 (HH:mm),那么对于夏令时,一小时的班次可能会导致前一天。 SQL DATE 与 'DATETIME 和 java 在 LocalDateTime 或旧日期上的时区的问题,

标签: java spring rest spring-mvc spring-data


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多