我只是不太明白我应该在以下示例中使用这两者中的哪一个:
我们有一个OfferEntity
which 有一个成员,该成员availableDay
是提供该优惠的日期。
现在,表格将如下所示:
CREATE TABLE IF NOT EXISTS offer (
created timestamp with time zone NOT NULL DEFAULT NOW(),
id BIGSERIAL PRIMARY KEY,
available timestamp with time zone
);
从PostgreSQL 文档中我们知道:
对于
timestamp with time zone
,内部存储的值始终采用 UTC(通用协调时间,传统上称为格林威治标准时间,GMT)。使用该时区的适当偏移量将具有指定明确时区的输入值转换为 UTC。如果输入字符串中没有说明时区,则假定它在系统TimeZone
参数指示的时区中,并使用时区的偏移量转换为 UTC。
这意味着在保留任何日期/时间信息时我应该没问题。
但这对我OfferEntity
和我定义的 REST 端点意味着什么OfferController
?
@Entity
@Table(name = "offer")
public class OfferEntity {
@Column(name = "available", nullable = false)
private ZonedDateTime availableDay;
}
对比
@Entity
@Table(name = "offer")
public class OfferEntity {
@Column(name = "available", nullable = false)
private Instant availableDay;
}
据我了解 - 这不应该有所作为。无论如何,PostgreSQL 都将所有内容都存储为 UTC,所以我应该能够接受Instant
还是ZonedDateTime
正确的?写点东西-> UTC。再读一遍->仍然是UTC。
甚至客户也无法区分:
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public Object hello() {
class Hello {
public Instant instant = Instant.now();
public ZonedDateTime zonedDateTime = ZonedDateTime.now();
public ZonedDateTime viennaTime = ZonedDateTime.now(ZoneId.of("GMT+2"));
public LocalDateTime localDateTime = LocalDateTime.now();
}
return new Hello();
}
将返回:
{
"instant": "2018-10-07T15:30:08.579Z",
"zonedDateTime": "2018-10-07T15:30:08.579Z",
"viennaTime": "2018-10-07T17:30:08.579+02:00",
"localDateTime": "2018-10-07T15:30:08.579",
}
但肯定有一个我显然没有看到的关键区别。
我可以看出两个不同之处。似乎 Spring 在转换"2018-10-07T15:30:08.579Z"
为Instant
对象方面没有问题,但如果我将类型更改为ZonedDateTime
. 至少开箱即用。
@RequestMapping("/places/{placeId}/offers", method = RequestMethod.GET)
public List<OfferDto> getOffers(
@PathVariable(name = "placeId") Long placeId,
@RequestParam(name = "date") ZonedDateTime date) {
return this.offerService.getOffers(placeId, date);
}
另一个区别是,如果我使用Instant
,我会强迫我的客户首先将他们所有的日期/时间字符串转换为 UTC。所以任何客户都必须myDate.toUTCString()
首先。ZonedDateTime
只要设置了时区,就需要任何时间,但我们为什么要关心呢?
那么两者中哪一个是更好的选择,为什么我会选择一个而不是另一个?