0

鉴于此实体,我需要发布合同类型的新对象。我 http://www.springframework.org/tags/form标签form/sf。我也有 jquery 数据选择器。我遇到的问题是 datapicker 返回一个 String 而不是 Date 对象。如何解析?我认为唯一可行的解​​决方案是从 datepicker 获取日期作为 @Controller 类中的 @RequestParam 并将其解析为 java.util.Date 对象。

@Entity
@Table(name = "contract")
public class Contracts {
    @Id
    @Column(name = "contract_id")
    private int contractId;
    @Column(name = "date_added")
    private Date creationDate;
    @Column(name = "date_start")
    private Date startDate;
    @Column(name = "date_end")
    private Date finishDate;
    @NotNull
    @Column(name = "payment_amount")
    private Integer paymentAmount;
    @Column(name = "payment_type")
    @Enumerated(EnumType.STRING)
    private PaymentType paymentType;
    private boolean valid;
    @ManyToOne
    @JoinColumn(name = "system_id")
    private Systems system;

这是我的 Controller 类的“POST”部分。

@RequestMapping(value = "/createcontract", method = RequestMethod.POST)
public String createContract(@ModelAttribute("contract") @Valid final Contracts contract, BindingResult results,
        @RequestParam("system-id") int systemId) {
    if(results.hasErrors())
        return "newcontract";
    return "redirect:contracts";

另一个问题(因为我标记了 postgresql)是否可以将 java.util.Data 对象存储在 postgresql 中作为日期,或者我应该将其存储为“带时区的时间戳”?

4

2 回答 2

0

导入java.sql.Timestamp;或导入 java.sql.Date;添加此导入您的 pojo 。

于 2017-06-22T07:05:30.310 回答
0

jQuery UI DatePicker 给出 Date 对象

该插件允许您使用getDate 方法获取 Date 对象。

这是一个带有工作示例的 Plunker 。

$(function() {
  $('#datePicker').datepicker();
  $('#datePicker').on('change', () => {
      let date = $('#datePicker').datepicker('getDate');
      alert(`Date ${date} is ${date instanceof Date ? 'a Date object' : 'not a Date object'}`);
  });
});

日期类型 - JPA 到 PostgreSQL 的映射

  1. timestamp with time zone在 PostgreSQL 中使用

通常最好在数据库中将日期保留为 UTC。这将提供最大的灵活性,因为您可以在所需的任何区域表示日期。这转化为将timestamp with time zone用作存储为 UTC 的类型。这意味着在存储您的日期时间之前,会添加区域偏移量以获得 UTC。

  1. 将时区设置为 JVM 或 JPA 提供者的 UTC

重要的是,您的所有日期都以 UTC 表示,而不是在特定时区。当这些通过线路发送到您的数据库时,会话需要具有 UTC 时区。

这意味着时区需要在 JVM 或 JPA 提供程序(例如:Hibernate)上为 UTC。

本博客所述,您可以通过以下方式设置 UTC:

虚拟机: java -Duser.timezone=UTC -jar blabla.jar

或通过

虚拟机: TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));

或通过

休眠:(application.properties)spring.jpa.properties.hibernate.jdbc.time_zone = UTC

检查哪个版本适合您。

  1. 持久Date字段

因此,您的字段可以表示为:

@Column(name = "date_added", columnDefinition = "TIMESTAMP WITH TIMEZONE")
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;

并且您需要确保该Date对象以 UTC 表示日期时间。

  1. 有用的映射

您可以将 Date 对象存储在 PostgreSQL 中:

  • timestamp有或没有时区
  • time有或没有时区
  • date

@Temporal使用应用于您的字段的 JPA 注释,Date您可以指定对象的映射方式:

  • @Temporal(TIMESTAMP)时间戳
  • @Temporal(DATE)date
  • @Temporal(TIME)time

timestamp with timezone还可以使用 annotation指定您的列@Column(columnDefinition = "TIMESTAMP WITH TIMEZONE")

于 2017-06-21T18:51:32.600 回答