标签: jsr310

证明 310 OffsetDate 类型合理的用例有哪些?

OffsetDate表示具有区域偏移量的日期。我不明白这个类的用途,证明它存在的主要用例是什么?

java-8 jsr310

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

使用DateTimeFormatter序列化的Java-8 LocalDateTime

我正在使用Dropwizard 0.8.4和jackson-datatype-jsr310。

a)想要将我的LocalDateTime序列化为DateTimeFormatter.ISO_INSTANT的JSON输出,但是找不到任何干净的方法(不实现自定义序列化类),这不是简单注释的标准做法吗?

目前,我的代码适用于:

@JsonProperty
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss'Z'")
@JsonSerialize(using = LocalDateTimeSerializer.class)
public LocalDateTime getTime() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是该模式与ISO_INSTANT并不完全相同,并且在我对其进行调试时,甚至无法通过String模式显示ISO_INSTANT。

b)我会更好地使用Joda-Time,默认情况下似乎由Dropwizard支持吗?

c)是否可以根据值(布尔值为false)跳过将Java字段序列化为JSON的方法?我尝试了@JsonFilter和SimpleBeanPropertyFilter,但没有使它正常工作,而且它似乎也已弃用。而且@JsonProperty(defaultValue ...)似乎也不起作用。

jackson java-8 jsr310 dropwizard

5
推荐指数
0
解决办法
5584
查看次数

当 Java DateTime 中的 Duration.between() 返回负值时

我正在准备 Java OCP 测试,在模拟测试中有一个关于 Java DateTime 的问题,如下所示:

鉴于纽约比洛杉矶早 3 小时,以下代码将打印什么?

LocalDateTime ldt = LocalDateTime.of(2017, 12, 02, 6, 0, 0);         
ZonedDateTime nyZdt = ldt.atZone(nyZone);
ZonedDateTime laZdt = ldt.atZone(laZone);
Duration d = Duration.between(nyZdt, laZdt);
System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

正确答案是 PT3H 但我有点困惑,这本书是否给出了错误的答案?

鉴于纽约比洛杉矶早 3 小时,这是否意味着,例如,纽约是 5:00,然后洛杉矶将是 2:00。所以Duration.between(5,2)应PT3H因为根据的Javadoc: The result of this method can be a negative period if the end is before the start. To guarantee to obtain a positive duration call abs() on the result.,并且在这种情况下,“2” “5”所以结果应该是PT3H,不PT3H。

你怎么看,哪一个是正确的?

java datetime duration timezone-offset jsr310

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

如何使用 Spring MongoTemplate 将 Java 8 Instant 以日期类型保存到 MongoDB?

我有一个具有Instant成员变量类型的 Java 类:

public class SomeRecord {
    private String someId;

    private Instant someInstant;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 MongoTemplate 更新someInstant数据库中的字段:

public SomeRecord updateSomeRecordBySomeId(final String someId, Object someInstant) {
        Query query = new Query();
        query.addCriteria(Criteria.where("someId").is(someId));

        Update update = new Update();
        update.set("someInstant", someInstant);

        return operations.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), SomeRecord.class);
}
Run Code Online (Sandbox Code Playgroud)

如果我将该方法调用为:

updateSomeRecordBySomeId("SOME-ID", Instant.now()); 将字段作为Date类型持久保存在数据库中: "someInstant" : ISODate("2017-07-11T07:26:44.269Z")


现在该方法也可以被调用为: updateSomeRecordBySomeId("SOME-ID", "2017-07-11T07:26:44.269Z");

在这种情况下,我得到一个例外:

org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [java.lang.String] 转换为类型 [java.time.Instant] 的转换器

这是完全有道理的。(它会更新数据库中的字段String"someInstant" : "2017-07-11T07:26:44.269Z"


所以我添加了一个转换器,如下所示:

MongoConfig.java: …

java spring mongodb jsr310 mongotemplate

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

JAX-RS客户端对Java8日期/时间进行Jackson(反)序列化

我正在为REST端点创建一个服务客户端,将JAX-RS客户端用于HTTP请求,并使用Jackson来(反)序列化JSON实体。为了处理JSR-310(Java8)日期/时间对象,我将该com.fasterxml.jackson.datatype:jackson-datatype-jsr310模块作为对服务客户端的依赖项添加,但是我没有使它起作用。

如何配置JAX-RS和/或Jackson使用jsr310模块?

我使用以下依赖项:

<dependency>
  <groupId>javax.ws.rs</groupId>
  <artifactId>javax.ws.rs-api</artifactId>
  <version>${jax-rs.version}</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>${jackson.version}</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我不想使服务客户端(以库形式发布)依赖于任何特定的实现(例如Jersey),因此我仅依赖于JAX-RS API。为了运行集成测试,我添加了:

<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>${jersey.version}</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.inject</groupId>
  <artifactId>jersey-hk2</artifactId>
  <version>${jersey.version}</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>${jersey.version}</version>
  <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

JAX-RS客户端的实例化是在工厂对象中完成的,如下所示:

import javax.ws.rs.Produces;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;

@Produces
public Client produceClient() {
    return ClientBuilder.newClient();
}
Run Code Online (Sandbox Code Playgroud)

典型的DTO如下所示:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.time.Instant;

import static java.util.Objects.requireNonNull;

@JsonPropertyOrder({"n", "t"})
public final class Message {

    private final String name;
    private final …
Run Code Online (Sandbox Code Playgroud)

java json jax-rs jackson jsr310

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

最新的Spring Data/Hibernate在本机查询中不支持java.time.LocalDate?

问题:使用Spring Data返回日期的本机查询返回java.sql.Date而不是java.time.LocalDate,尽管已设置.

上下文:一个使用Spring Boot 2.0.0.M5(最新版)的新项目,Hibernate 5.2.11,Hibernate-Java8 5.2.12(只要它在类路径上,它就支持JSR310类).

下面的匿名示例(该应用程序并非真正关于生日):

public interface BirthdayRepository<T, ID extends Serializable> extends Repository<T, ID> {
    @Query(value = "select day from birthdays", nativeQuery = true)
    Iterable<java.sql.Date> getBirthdays(); //the return type should ideally be java.time.LocalDate
}
Run Code Online (Sandbox Code Playgroud)

在数据库(SQL Server)中,日期字段为DATE,值类似于2017-10-24.

问题是在运行时,Spring Data存储库(其实现我无法控制,或者有没有办法?)返回java.sql.Datejava.time.LocalDate(澄清:返回类型似乎由Spring Data决定,java.sql.Date即使我将返回类型更改为是的java.time.LocalDate,这就是我开始的方式).

有没有办法LocalDate直接获得?我可以稍后转换它,但(1)效率低下;(2)存储库方法必须返回旧的日期/时间类,这是我想要避免的.我阅读了Spring Data 文档,但没有任何相关内容.

编辑:对于任何有相同问题的人,下面是解决方案,Jens建议的转换器.

public class LocalDateTypeConverter {

    @Converter(autoApply = true)
    public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

        @Nullable
        @Override
        public Date convertToDatabaseColumn(LocalDate …
Run Code Online (Sandbox Code Playgroud)

spring-data jsr310 spring-data-jpa hibernate-5.x localdate

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

ZonedDateTime ISO-8601 解析:为什么需要时区 ID 中的冒号?

我有以下测试。

@Test
void withoutColon_fails() {
    ZonedDateTime.parse("2019-01-24T12:10:58.036820+0400");
}

@Test
void withColon_ok() {
    ZonedDateTime.parse("2019-01-24T12:10:58.036820+04:00");
}
Run Code Online (Sandbox Code Playgroud)

我试图解析的日期时间之间的唯一区别是,在第一种情况下,时区指定的小时和分钟之间没有冒号,而在第二种情况下有一个冒号。

第一个失败:

java.time.format.DateTimeParseException: Text '2019-01-24T12:10:58.036820+0400' could not be parsed, unparsed text found at index 29

    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:598)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:583)
Run Code Online (Sandbox Code Playgroud)

根据 javadoc, parse(), through DateTimeFormatter.ISO_ZONED_DATE_TIME, 最终使用DateTimeFormatter.ISO_OFFSET_DATE_TIME, 反过来,我们可以读到它是

ISO 日期时间格式化程序,用于格式化或解析具有偏移量的日期时间,例如“2011-12-03T10:15:30+01:00”。

进一步遵循 javadoc 链接,我们会看到ZoneOffset.getId()它表示它接受:

Z - for UTC (ISO-8601)
+hh:mm or -hh:mm - if the seconds are zero (ISO-8601)
+hh:mm:ss or -hh:mm:ss - if the seconds are non-zero (not ISO-8601) …
Run Code Online (Sandbox Code Playgroud)

java iso8601 jsr310 zoneddatetime

5
推荐指数
0
解决办法
153
查看次数

JSR310 Year.parse() 抛出 DateTimeParseException 值 &lt; 1000

我正在尝试使用 解析 0 到 1000 范围内的 Year String 值java.time.Year.parse(),但是解析失败java.time.format.DateTimeParseException: Text '999' could not be parsed at index 0

Year.parse状态的javadoc :

Obtains an instance of Year from a text string such as 2007. 
The string must represent a valid year. Years outside the range 0000 to 9999 
must be prefixed by the plus or minus symbol.
Run Code Online (Sandbox Code Playgroud)

重现此问题的示例测试:

Obtains an instance of Year from a text string such as 2007. 
The string must represent a valid year. …
Run Code Online (Sandbox Code Playgroud)

java jsr310

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

无法使用Jackson将java.time.LocalDate序列化为字符串

我正在使用包含jsr310数据类型的带有杰克逊2.6.2的spring-boot 1.2.1.RELEASE。我正在使用批注@SpringBootApplication启动Spring应用程序。我有

spring.jackson.serialization.write_dates_as_timestamps = false
Run Code Online (Sandbox Code Playgroud)

在我的application.properties中设置(我知道它正在读取,因为我使用banner = false进行了测试)。

然而,java.time.LocalDate仍被序列化为整数数组。我没有使用@EnableWebMvc。

好像我添加了标签

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
Run Code Online (Sandbox Code Playgroud)

到我的LocalDate变量,然后它可以工作。但是我以为上面的属性集是自动的。另外,如果我没记错的话(从那以后我就决定使用整数数组),那只适用于序列化而不是反序列化(但是我不能坦白地记得最后一部分是否正确)。

jackson jsr310 spring-boot

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

如何将 Vaadin DateField 绑定到 LocalDateTime

Vaadin文档展示了如何使用DateFieldwithjava.util.Date但我想将DateFieldwith a绑定BeanFieldGroup到 Java 8 type 的 bean 属性java.time.LocalDateTime。我怎样才能做到这一点?

vaadin jsr310 vaadin7

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