标签: java.time.instant

如何在 Restful API 正文响应中将 Java 'java.time.Instant' 属性作为 json 值返回?

我有一个 Spring Boot Restful API 服务,它在其响应中返回一个 Java 对象,该对象被转换为 json。

Java 对象属性之一是“Java.time.Instant”。我应该如何将其转换为返回的 json 对象?

更新

我尝试过使用 @JsonFormat 但这不起作用......

返回的 Java 对象有一个“Instant”属性...

 @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ",timezone = "UTC")
 public Instant getRequested() {
     return Requested;
}
Run Code Online (Sandbox Code Playgroud)

这将在 json 响应正文中返回为...

"requested": {
    "epochSecond": 1499342121,
    "nano": 868000000
},
Run Code Online (Sandbox Code Playgroud)

我正在使用 Spring Boot 1.5.4

控制器的方法是...

@RequestMapping(value="/", method= RequestMethod.POST)
public AcceptedAccountRequest newRequest(@RequestBody NewAccountRequest aRequest) {
AcceptedAccountRequest anAcceptedRequest = createAccepted(aRequest);
return anAcceptedRequest;
}
Run Code Online (Sandbox Code Playgroud)

java rest spring java.time.instant

7
推荐指数
1
解决办法
1万
查看次数

我应该使用什么Java DateTime类?

我们有一个用于生成报告的库.它从数据文件(SQL,XML,JSON等)中读取,然后可以在用户编写的等式中修改日期时间,然后将其格式化为报告输出的指定.

等式中的使用可以添加一个时间跨度,获取值的一部分,如"if date.month == 2",以及Excel中的几乎所有日期时间宏.

因为数据可以是JSON(或没有架构的XML),所以日期时间可以是"2019-01-25","2019-01-25T14:32:23","2019-01-25T14:32:23.12345"," 2019-01-25T14:32:23Z",或"2019-01-25T14:32:23Z-0500"(最后两个也可以有".12345").

如果没有时区偏移,我们假设日期时间是UTC.虽然这应该是真的,但通常它不是,它是当地时间,但它的使用方式,无关紧要.因此,除非指定时区偏移,否则将其设为UTC(到目前为止,我们已使用Date).

第一个问题 - 我应该使用什么类来保持这个值?根据我的阅读,我认为ZonedDateTime,但也许是即时?

第二个问题 - 当我必须做3天加入日期时间时,我应该在什么课上使用?

第三个问题 - 是否有一些解析器可以解析上面列出的所有不同的字符串?或者我需要调用String.contains()来确定格式,然后根据它做一个显式模式?如果是这样,使用什么类?

java java-time zoneddatetime java.time.instant

7
推荐指数
1
解决办法
546
查看次数

两个实例之间的Java年份

在Joda中,我们可以计算2个Datetime之间的年份

Years.between(dateTime1, dateTime2);
Run Code Online (Sandbox Code Playgroud)

是否有任何简单的方法可以在2个时刻之间找到使用java.timeAPI而没有太多逻辑的年份?

ChronoUnit.YEARS.between(instant1, instant2)
Run Code Online (Sandbox Code Playgroud)

失败:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
        at java.time.Instant.until(Instant.java:1157)
        at java.time.temporal.ChronoUnit.between(ChronoUnit.java:272)
        ...
Run Code Online (Sandbox Code Playgroud)

java datetime date-difference java-8 java.time.instant

6
推荐指数
1
解决办法
1036
查看次数

java.time和JPA

类作为LocalDateTime从封装java.time基于值类.如果我有一个实体使用这样的对象作为字段,我会遇到以下"问题":不应序列化基于值的类.但是,JPA实体必须实现Serializable接口.这个悖论的解决方案是什么?不应该有人使用LocalDateTime作为JPA实体的字段吗?使用日期代替?这将是不满意的.

这个问题是一个声纳规则squid:S3437,因此项目中存在很多错误,因为我们从Date更改为LocalDateTime ...

基于价值的课程使用导致的不合规解决方案:

@Entity
public class MyEntity implements Serializable{
    @Column
    private String id; // This is fine
    @Column
    private LocalDateTime updated; // This is not ok, as LocalDateTime is a value based class
    @Column
    private Date created; // This however is fine..
}
Run Code Online (Sandbox Code Playgroud)

java jpa java-8 sonarqube java.time.instant

6
推荐指数
1
解决办法
956
查看次数

即时与ZonedDateTime

我只是不太了解在以下示例中应该使用这两个中的哪一个:

我们有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

6
推荐指数
1
解决办法
813
查看次数

仅使用 Spring Boot Data JPA/Java 8 Instant 查询日期?

我有一个 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)

或者我是否被迫找到一种方法将一天转换为两个瞬间并在查询之间进行?

java jpa date spring-boot java.time.instant

5
推荐指数
1
解决办法
9865
查看次数

将日期从ISO 8601 Zulu字符串转换为Java 8中的java.time.Instant

我想将字符串日期格式转换为java.time.Instant

我在解析日期时遇到异常.

 java.lang.IllegalArgumentException: Too many pattern letters: s
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码进行转换,从String到date.

    String string = "2018-07-17T09:59:51.312Z";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD'T'hh:mm:ss.sssZ", Locale.FRANCE);
    LocalDate date = LocalDate.parse(string, formatter);
    System.out.println(date);
Run Code Online (Sandbox Code Playgroud)

我想转换"timestamp":"2018-07-17T09:59:51.312Z"YYYY-MM-DDThh:mm:ss.sssZUTC时区中以ISO 8601格式的格式时间.

检查Java字符串到日期的转换,但不起作用.

java datetime datetime-format java-8 java.time.instant

5
推荐指数
2
解决办法
2088
查看次数

逗号后超过 6 位数字(纳秒)的舍入瞬间

我有带有TIMESTAMP字段的 postgresql,其中有带有日期和时间的 Instant。例如:2021-10-13T15:04:24.944921Z

可以看到,逗号-后面有 6 位数字944921。但是如果我有更多数字怎么办,例如:2021-10-13T07:14:47.791616921Z. 我怎样才能正确地舍入这样Instant2021-10-13T07:14:47.791617Z

java datetime timestamp rounding java.time.instant

5
推荐指数
1
解决办法
3514
查看次数

Java 8日期/时间:即时,无法在索引19处解析

我有以下代码:

String dateInString = "2016-09-18T12:17:21:000Z";
Instant instant = Instant.parse(dateInString);

ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev"));
System.out.println(zonedDateTime);
Run Code Online (Sandbox Code Playgroud)

它给了我以下异常:

线程“主”中的异常java.time.format.DateTimeParseException:无法在java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:的索引19处解析文本'2016-09-18T12:17:21:000Z' 1949)在java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)在java.time.Instant.parse(Instant.java:395)在core.domain.converters.TestDateTime.main(TestDateTime.java:10 )

当我将最后一个冒号更改为句号时:

String dateInString = "2016-09-18T12:17:21.000Z";
Run Code Online (Sandbox Code Playgroud)

…然后执行正常:

2016-09-18T15:17:21 + 03:00 [欧洲/基辅]

因此,问题是-如何使用Instant和解析日期DateTimeFormatter

java time parsing date java.time.instant

4
推荐指数
1
解决办法
6606
查看次数

订购由即时设置

我有一个Java Set,我提供信息:

Set<myData> dataLocations = getData(location);
Run Code Online (Sandbox Code Playgroud)

我想排序这个Set我已经尝试过sortedSet并且无法让它工作,所以我尝试了这个

dataLocations = dataLocations.stream().sorted(Comparator.comparing(myData -> myData.expDtTm)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在Java文档中,它不保证保留任何订单.所以我尝试了这个:

TreeSet<myData> sortedDataLocations = dataLocations.stream().sorted(Comparator.comparing(myData -> myData.expDtTm)).collect(Collectors.toCollection(TreeSet<myData>));
Run Code Online (Sandbox Code Playgroud)

不用说它没有用,所以任何有任何其他想法的人都会非常感激.

java collections java-stream java.time.instant

4
推荐指数
1
解决办法
905
查看次数