Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java 春季休眠不必要的时区调整_Java_Mysql_Spring_Hibernate_Date - Fatal编程技术网

Java 春季休眠不必要的时区调整

Java 春季休眠不必要的时区调整,java,mysql,spring,hibernate,date,Java,Mysql,Spring,Hibernate,Date,我有一个简单的服务,它将日期作为字符串(以及其他字段)输入,并将其保存到mySql数据库中。我正在使用带Hibernate的Spring Boot。 如果我用{“expenseDate”:“04/02/2017”}发布JSON,则在jackson映射之后捕获的日期是“2017-04-01 19:00:00” 顺便说一句,如果我查看数据库中的行,日期是“2017-04-02”,正如我预期的那样。当我查询服务时,json中返回的日期是正确的,但是当我从数据库中转储行时,它们都返回正确的日期减去6小时

我有一个简单的服务,它将日期作为字符串(以及其他字段)输入,并将其保存到mySql数据库中。我正在使用带Hibernate的Spring Boot。 如果我用
{“expenseDate”:“04/02/2017”}
发布JSON,则在jackson映射之后捕获的日期是“2017-04-01 19:00:00”

顺便说一句,如果我查看数据库中的行,日期是“2017-04-02”,正如我预期的那样。当我查询服务时,json中返回的日期是正确的,但是当我从数据库中转储行时,它们都返回正确的日期减去6小时

我住在中央时区,所以我猜数据库中的日期是UTC,Spring因为在中央时区而休假六个小时

控制器:

@PostMapping("/expenses")
public ResponseEntity<Expense> submitExpense(@RequestBody Expense expense) throws BadHttpRequest {
    expenseService.saveExpense(expense);
    return new ResponseEntity<>(expense, HttpStatus.CREATED);
}
我在日期字段上尝试了
@JsonFormat(pattern=“MM/dd/yyyy”,timezone=“UTC”)
,但没有任何改变

我还尝试使用日期部分从视图构造日期,并将其作为一个长的向下传递给服务,但结果是相同的。很明显,我错过了一些极其重要的,很可能是简单的东西


有什么想法吗

您可能需要放置一个名为serverTimezone的数据库连接url参数。

您可能需要放置一个名为serverTimezone的数据库连接url参数。

您应该将“时区”设置为您期望传入日期所在的任何时区

public class Data {

    @JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00")
    Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

public class Main {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

        ObjectMapper mapper = new ObjectMapper();
        Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class);
        System.out.println(data.date);
    }
}
输出

2017年4月2日星期日美国东部时间00:00:00

// I am located in EDT
如果我假设传入日期是UTC

@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC")
Date date; 
输出

美国东部时间2017年4月1日星期六20:00:00

// I am located in EDT
默认情况下,它似乎将日期视为UTC。在你的情况下,如果你在CST中,你应该考虑设置中央时间时区(我相信<强>美国/中心< /强>)。p>
注意
如果您的日期输入可以来自不同时区的客户,这将是另一个讨论。您很可能需要定义一个合同,客户机在特定时区中输入日期,或者明确指定一个时区作为附加输入,或者让您的客户机端(如果存在)执行到服务器端期望的特定时区的转换。

您应该设置“时区”到达您希望到达的日期所在的任何时区

public class Data {

    @JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00")
    Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

public class Main {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

        ObjectMapper mapper = new ObjectMapper();
        Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class);
        System.out.println(data.date);
    }
}
输出

2017年4月2日星期日美国东部时间00:00:00

// I am located in EDT
如果我假设传入日期是UTC

@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC")
Date date; 
输出

美国东部时间2017年4月1日星期六20:00:00

// I am located in EDT
默认情况下,它似乎将日期视为UTC。在你的情况下,如果你在CST中,你应该考虑设置中央时间时区(我相信<强>美国/中心< /强>)。p>
注意

如果您的日期输入可以来自不同时区的客户,这将是另一个讨论。您很可能需要定义一个合同,客户机在特定时区输入日期,或明确指定一个时区作为附加输入,或让您的客户端(如果存在)转换到服务器端期望的特定时区。

当您在JSON输入中通过2017年2月4日时,那个日期应该在哪个时区?您的服务的使用者是否应该以UTC传递日期?我可能有点天真,但我只会假设该日期的值而不做任何修改,因此截断的日期将具有传递的值。这正是它在数据库中的样子,所以看起来我所做的是正确的,除了没有正确的相加,当我截取对象时,实际值是关闭的,当您在JSON输入中通过2017年2月4日时,该日期应该在哪个时区?您的服务的使用者是否应该以UTC传递日期?我可能有点天真,但我只会假设该日期的值而不做任何修改,因此截断的日期将具有传递的值。这正是它在数据库中看起来的样子,所以看起来我所做的是正确的,除了没有什么加起来正确,当我截取对象时,实际值为off这是问题的一部分-我在db url上设置了UTC属性-我需要将其更改为我的本地时区。如果我让它单独使用数据库的默认值,让spring使用默认值,那就好了。谢谢这是问题的一部分-我将db url上的属性设置为UTC-我需要将其更改为我的本地时区。如果我让它单独使用数据库的默认值,让spring使用默认值,那就好了。谢谢这是一个很大的帮助-结合下面的答案。我已经在db connection属性和实体的jsonformat上将时区设置为UTC-将其更改为我的本地时区解决了这个问题。如果我没有设置db参数,让spring使用默认的时区,这一切都会发生。这是一个很大的帮助-结合下面的答案。我已经在db connection属性和实体的jsonformat上将时区设置为UTC-将其更改为我的本地时区解决了这个问题。现在一切都在敲响警钟,如果我没有设置db参数并让spring使用默认时区,这就不会发生