我没有为我的JPA应用程序设置CET时区,该应用程序使用AuditingEntityListener来增加创建/最后修改的日期。
我已经尝试过的事情:
在我的application.properties(两种组合)中:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC+1
spring.jpa.properties.hibernate.jdbc.time_zone=CET
Run Code Online (Sandbox Code Playgroud)
为我的JDBC连接添加了时区(两种组合)
spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC+1
spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET
Run Code Online (Sandbox Code Playgroud)
添加了后构建(应用程序级别)
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC+1"));
}
Run Code Online (Sandbox Code Playgroud)
还尝试使用以下方法在数据库级别设置时区:
SET time_zone='+01:00';
Run Code Online (Sandbox Code Playgroud)
无论如何都没有成功,我是否缺少某些东西?
使用@createdDate如下:
编辑
@Data
@Builder
@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
@AllArgsConstructor
public class OrderHistoryRecord {
@Id
@GeneratedValue
@JsonIgnore
private Long id;
@NotNull
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Order.class)
@JoinColumn(name = "order_id", updatable = false)
@JsonIgnore
private Order order;
@CreatedDate
private Date date;
@Enumerated(EnumType.STRING)
private PaymentStatus paymentStatus;
@Enumerated(EnumType.STRING)
private ShipmentStatus shipmentStatus;
@Enumerated(EnumType.STRING)
private OrderHistoryRecordType type;
}
Run Code Online (Sandbox Code Playgroud) 在下面的剪辑中,属性$F是类java.time.LocalDateTime或java.time.LocalDate.
<textField pattern="EE. dd.MM.yyyy">
<reportElement...>
</reportElement>
<textFieldExpression><![CDATA[$F{theLocalDateTime}]]></textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud)
如何pattern在jasper报告中使用textField格式化此属性 ?
将Joda时间迁移到Java 8
乔达:
UserObject user = new UserObject()
user.setCreatedAt(new DateTime(rs.getTimestamp("columnName")));`
Run Code Online (Sandbox Code Playgroud)
迁移至Java 8
这是我的代码;它确实可以编译;我怀疑它是否有效:
ZonedDateTime.ofInstant(rs.getTimestamp("columnName").toLocalDateTime().toInstant(ZoneOffset.UTC),ZoneId.of("UTC")));
Run Code Online (Sandbox Code Playgroud)
在某些情况下,日期是错误的。有什么建议吗?
我只是不太了解在以下示例中应该使用这两个中的哪一个:
我们有OfferEntity一个成员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
);
Run Code Online (Sandbox Code Playgroud)
从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;
}
Run Code Online (Sandbox Code Playgroud)
与
@Entity
@Table(name = "offer")
public class OfferEntity {
@Column(name = "available", …Run Code Online (Sandbox Code Playgroud) postgresql utc timestamp-with-timezone zoneddatetime java.time.instant
在我们的新(基于 Java 8)应用程序中,我们希望存储审计信息,例如lastModifiedAt和createdAt。
目前,这些属性有一个java.sql.Timestamp类型,表示时间点 (UTC)。新应用程序不再使用 SQL 数据库,我们希望使用新的java.timeAPI。
什么类型最适合?
java.sql.Timestamp ,因为它根据Oracle 技术网文章 Java SE 8 日期和时间映射到java.sql.Timestamp。因为新java.time类型在此用例中提供了哪些优势?java.sql.Timestamp更高效(更少的对象创建)。我有一个 Spring boot 1.4.x 应用程序,它结合使用了 starter jpa 和 H2/Postgresql。我有一个实体将日期存储为 Instant(使用 Instant.now(),基于Java 8:Instant 和 LocalDateTime 之间有什么区别?答案),并且关联的表将此字段存储为时间戳。
为了存储工作,我必须设置一个转换器,将 Instant 转换为 sql.Timestamps,反之亦然,这似乎有效(Timestamp.from(instant) 和 timestamp.toInstant())
我的问题是,是否有一种直接的方法可以使用 JPA 存储库仅使用此即时按日期查询,例如。
List<Orders> findBySaleTime(.... day)
或者我是否被迫找到一种方法将一天转换为两个瞬间并在查询之间进行?
我正在从在 Spring MVC 应用程序中使用新类java.sql.Timestamp转向java.util.GregorianCalendar使用新类。java.time.*
所以我改变了每一个
private GregorianCalendar field;
Run Code Online (Sandbox Code Playgroud)
到
private LocalDate field;
Run Code Online (Sandbox Code Playgroud)
或者
private LocalDateTime field;
Run Code Online (Sandbox Code Playgroud)
但现在当序列化这些 bean 时,它们会像这样序列化:
"field": {
"year": 1970,
"month": "JANUARY",
"dayOfMonth": 18,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 18,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
Run Code Online (Sandbox Code Playgroud)
我找到了其他问题的答案,提到添加对jackson-datatype-jsr310 的依赖项并获得:
"field": [
1970,
1,
18
],
Run Code Online (Sandbox Code Playgroud)
但我在序列化时仍然想要一个 unix 时间戳,就像我在字段中得到的那样GregorianCalendar:我怎样才能实现这一点?我可以避免使用自定义序列化器(和反序列化器)吗?
这些与资源响应和请求主体(如 POST、PUT 等)相关,而不是请求参数。
Jackson 的ObjectMapper配置如下:
jacksonConverter.getObjectMapper().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jacksonConverter.getObjectMapper().disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
Run Code Online (Sandbox Code Playgroud) 我有一个带有 @JsonFormat 的 LocalDateTime 字段
@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
private LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud)
当 Jackson 尝试解析像2018-11-28T15:24:00.000Z这样的日期时,会抛出异常
com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.time.LocalDateTime 的实例:没有字符串参数构造函数/工厂方法来从字符串值反序列化('2018-11-28T15:24:00.000Z')
在我的 pom.xml 中我有:
我的 ObjectMapper Bean:
@Bean
public ObjectMapper postConstruct() {
return this.builder
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.defaultUseWrapper(false)
.build();
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", timezone ="UTC")
private LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud) 我想代表一个“营业日期”,例如“2019 年 6 月 3 日”发生的交易。为此,我们主动忽略时区,因为我们完全知道日本的“2019 年 6 月 3 日”可能是美国的“2019 年 6 月 2 日”——而在“一天”内订购同样无关紧要。所有日期都是今天或之前的日期。
我显而易见的答案是,这是一个LocalDate. 但是,其他人建议将其表示为Instantof更好2019-06-03T00:00:00.000Z。
除了在 UI 中将其转换/格式化为人类可读的日期时我们必须进行的不同调用,这两种方法之间实际上有什么区别吗?
这是一个与Instant 和 LocalDateTime 之间有什么区别的不同问题?因为时间与这个问题无关,它只与过去(或当前)日期有关。
我正在使用 TrueTime 库,它Date在系统时区返回。Date当我将其转换为毫秒时,我在将其转换为 UTC 日期时遇到问题。
这是我所做的:
// getting true time in GMT [ex : 2020-07-13T18:00:57.192+03:00 [Europe/Istanbul]]
Date now = getTrueNowTimeInGMT();
// I like to use `LocalDateTime`, so I am converting `Date` to `LocalDateTime`:
LocalDateTime ldtOfSystem = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault());
// Converting system default zone to UTC
ZonedDateTime zdtOfSystem = ldtOfSystem.atZone(ZoneId.systemDefault());
ZonedDateTime zdtOfSystemInUTC = zdtOfSystem.withZoneSameInstant(ZoneId.of("UTC"));
// Making sure that it is in the UTC. It is returning correct UTC time [ex: 2020-07-13T15:00:57.192 [UTC]]
System.out.println(zdtOfSystemInUTC);
// converting zdtOfSystemInUTC to …Run Code Online (Sandbox Code Playgroud)