gpt4 book ai didi

java - 更新时记录的日期时间被设置为向后 3 小时

转载 作者:行者123 更新时间:2023-11-29 17:58:23 25 4
gpt4 key购买 nike

我正在 Spring boot 和 Hibernate 中开发 CRUD 应用程序。我有一个名为 Order 的表。该表有两列,分别为 status(整数)和 datetime(类型为 mysql datetime)。在我的应用程序中,我定期更新其中一行中的 status 列的值。

当我这样做时,会发生一些奇怪的事情。该记录的 status 列已更新,但是,datetime 列也正在更新,我什至没有指示。每次更新一行后,datetime 都会设置为比之前的值早 3 小时。

我正在 Java 的 Spring Boot 和 Spring Boot JPA MySQL 中开发此应用程序。我正在使用 JPA 存储库。这是进行更新的片段:

public String incrementOrderStatus(Long orderId) {
Order order = orderRepository.findOne(orderId);
OrderState nextState = order.getState().next();
order.setState(nextState);
orderRepository.save(order);
return nextState.toString();
}

订单具有以下属性:

@Data
@Entity
@Table(name = "`order`")
@NoArgsConstructor
@AllArgsConstructor
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, updatable = false)
private Long id;

private String name;
private Calendar datetime;

@Enumerated(EnumType.ORDINAL)
private OrderState state;

private String address;
private String phoneNumber;
private String email;

@Enumerated(EnumType.ORDINAL)
private OrderSource source;

private Float totalPrice;

@ManyToOne(optional = true)
private Offer offerUsed;

private String notes;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "order", fetch = FetchType.LAZY)
private List<MealOrderDescriptor> meals;

public Order(CustomOrderView orderView) {
this.name = orderView.getName();
this.datetime = Calendar.getInstance(TimeZone.getTimeZone("Europe/Istanbul"));
this.state = OrderState.PENDING;
this.address = orderView.getAddress();
this.phoneNumber = orderView.getPhoneNumber();
this.source = orderView.getSource();
this.totalPrice = orderView.getTotalPrice();
this.notes = orderView.getNotes();
}
}

在 JDBC 查询字符串中,我还将时区设置为我的时区,即 serverTimezone=Europe/Istanbul。我使用的 MySQL 版本为 5.7.19,JDBC 版本为 6.0.6,Java 1.8 和 Spring Boot 1.5.9,Ubuntu 16.04.3

提前致谢。

最佳答案

即使您没有在 orderRepository.save(order); 之前调用 order.setDatetime()datetime 字段也包含收到的值通过 orderRepository.findOne(orderId)。

之后,orderRepository.save(order);语句尝试使用orderRepository.findOne(orderId)收到的值更新datetime字段>。如果与之前的值相差负 3 小时,则可能是时区问题。

我想,如果你使用TIMESTAMP类型而不是DATETIME这种情况就会消失。因为MySQL DATETIME类型不保存TimeZone信息。

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)

您可以查看official documentation .

关于java - 更新时记录的日期时间被设置为向后 3 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48612569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com