Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaLocalDate在保存到MySQL数据库时以半随机天数的形式存储_Java_Mysql_Jpa_Localdate - Fatal编程技术网

JavaLocalDate在保存到MySQL数据库时以半随机天数的形式存储

JavaLocalDate在保存到MySQL数据库时以半随机天数的形式存储,java,mysql,jpa,localdate,Java,Mysql,Jpa,Localdate,我在将正确的Java LocalDates保存到MySQL数据库时遇到问题。当我记录日期时,它会显示正确的日期,但当我为两个不同的实体(用户和家庭)保存它时 住户总是提前一天将其保存为(一致且可通过时区差异解释),但是 用户保存了一个我不理解的半随机不同日期 有关正确日期、住户保存日期、用户保存日期和天数的示例,请参见图。下表显示了用户和住户日期之间的差异。2017年4月1日,用户实体的“随机”版本甚至有所不同 在我的MacBook Pro上本地运行时,日期是正确的,但日期差异出现在我们的

我在将正确的Java LocalDates保存到MySQL数据库时遇到问题。当我记录日期时,它会显示正确的日期,但当我为两个不同的实体(用户和家庭)保存它时

  • 住户总是提前一天将其保存为(一致且可通过时区差异解释),但是

  • 用户保存了一个我不理解的半随机不同日期

有关正确日期、住户保存日期、用户保存日期和天数的示例,请参见图。下表显示了用户和住户日期之间的差异。2017年4月1日,用户实体的“随机”版本甚至有所不同

在我的MacBook Pro上本地运行时,日期是正确的,但日期差异出现在我们的Java 11 Google应用程序引擎开发或生产环境中。你能帮我理解为什么会这样吗

使用REST Web服务接收日期,该服务将日期作为ISO格式的YYYY-MM-DD字符串接受为UserRegistrationCommand类的一部分。然后,此类在其getMoveInDate方法中将字符串转换为LocalDate对象:

public class UserRegistrationCommand {

    ...
    public String moveInDate;
    ...

    public LocalDate getMoveInDate() {
        if(moveInDate == null) {
            return null;
        }
        try {
            return LocalDate.parse(moveInDate, DateTimeFormatter.ISO_LOCAL_DATE);
        } catch (Exception e) {
            return null;
        }
    }
}
然后,我使用SpringJPA将用户和家庭实体的日期分别保存到MySQL数据库中,其中这些实体的表使用日期数据类型

当我记录保存前的日期时,它会显示正确的值。但是,当日期保存在数据库中时,用户表将获得一个多天的日期,而家庭表将获得一个比提交日期早一天的日期

(下面代码注释中的日期指的是我图像中的第一个日期示例)

保存用户实体:

@Transactional
public User createUser(String email, String password, String firstName, String lastName, String language, Household household, LocalDate moveInDate, String redirectState) {
    LOG.debug("Registering user {}, {}, moveInDate: {}", email, household, moveInDate != null ? moveInDate.toString() : "null"); // <-- Logs "Registering user ... moveInDate: 2017-08-01 ..."
    [...]
    Locale locale = localeProvider.matchAvailableLocale(language);
    User user = new User(email, encodedPassword, firstName, lastName, locale, household, moveInDate, NotificationPreferences.defaultPreferences());
    user.setRedirectState(redirectState);
    Image profilePicture = avatarService.createProfilePicture(user.getNameInitials());
    user.setProfilePicture(profilePicture);
    return save(user); // <-- calls userRepository.save(user), but date is stored as 2017-07-27
}

请至少包括
User
实体构造函数(在
createUser
方法中调用的构造函数),除非您可以共享整个类代码。你认为一天的一致差异是可以解释的,这是错误的:
LocalDate
is。
LOGGER.debug("ActivationCodeRegistrationStrategy.register: Setting moveInDate {} for household {} for user {}", cmd.getMoveInDate(), activationCode.getHousehold(), cmd.email); <-- logs "ActivationCodeRegistrationStrategy.register: Setting moveInDate 2017-08-01 ..."

householdService.setMoveInDate(activationCode.getHousehold(), cmd.getMoveInDate()); <-- but a date of 2017-07-31 is saved.
public void setMoveInDate(Household household, LocalDate moveInDate) {
    household.setMoveInDate(moveInDate);
    householdRepository.save(household);
}