JSR310日期时间API的支持

JSR310 日期与时间规范主要API如下:

Clock

时钟,类似于钟表的概念,提供了如系统时钟、固定时钟、特定时区的时钟

ResolvableType resolvableType10 = ResolvableType.forClassWithGenerics(List.class,

Integer.class);

ResolvableType resolvableType11=

ResolvableType.forArrayComponent(resolvableType10);

resolvableType11.getComponentType().getGeneric(0).resolve();

resolvableType7.isAssignableFrom(resolvableType11);

//时钟提供给我们用于访问某个特定 时区的 瞬时时间、日期 和 时间的。

Clock c1 = Clock.systemUTC(); //系统默认UTC时钟(当前瞬时时间

System.currentTimeMillis()

System.out.println(c1.millis()); //每次调用将返回当前瞬时时间(UTC

Clock c2 = Clock.systemDefaultZone(); //系统默认时区时钟(当前瞬时时间)

Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区

System.out.println(c31.millis()); //每次调用将返回当前瞬时时间(UTC

Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区

System.out.println(c32.millis());//每次调用将返回当前瞬时时间(UTC

Clock c4 = Clock.fixed(Instant.now(), ZoneId.of("Asia/Shanghai"));//固定上

海时区时钟System.out.println(c4.millis());

Thread.sleep(1000);

System.out.println(c4.millis()); //不变 即时钟时钟在那一个点不动

Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒

的时钟

System.out.println(c1.millis());

System.out.println(c5.millis());

Instant

瞬时时间,等价于以前的System.currentTimeMillis()

//瞬时时间 相当于以前的System.currentTimeMillis()

Instant instant1 = Instant.now();

System.out.println(instant1.getEpochSecond());//精确到秒 得到相对于1970-01-

01 00:00:00 UTC的一个时间

System.out.println(instant1.toEpochMilli()); //精确到毫秒

Clock clock1 = Clock.systemUTC(); //获取系统UTC默认时钟

Instant instant2 = Instant.now(clock1);//得到时钟的瞬时时间

System.out.println(instant2.toEpochMilli());

Clock clock2 = Clock.fixed(instant1, ZoneId.systemDefault()); //固定瞬时时

间时钟

Instant instant3 = Instant.now(clock2);//得到时钟的瞬时时间

System.out.println(instant3.toEpochMilli());//equals instant1

LocalDateTimeLocalDateLocalTime

提供了对java.util.Date的替代,另外还提供了新的DateTimeFormatter用于对格式化/解析的支持

//使用默认时区时钟瞬时时间创建 Clock.systemDefaultZone() -->即相对于

ZoneId.systemDefault()默认时区

LocalDateTime now = LocalDateTime.now();

System.out.println(now);

//自定义时区

LocalDateTime now2= LocalDateTime.now(ZoneId.of("Europe/Paris"));

System.out.println(now2);//会以相应的时区显示日期

//自定义时钟

Clock clock = Clock.system(ZoneId.of("Asia/Dhaka"));

LocalDateTime now3= LocalDateTime.now(clock);

System.out.println(now3);//会以相应的时区显示日期

//不需要写什么相对时间 如java.util.Date 年是相对于1900 月是从0开始

//2013-12-31 23:59

LocalDateTime d1 = LocalDateTime.of(2013, 12, 31, 23, 59);

//年月日 时分秒 纳秒

LocalDateTime d2 = LocalDateTime.of(2013, 12, 31, 23, 59,59, 11);//使用瞬时时间 + 时区

Instant instant = Instant.now();

LocalDateTime d3 = LocalDateTime.ofInstant(Instant.now(),

ZoneId.systemDefault());

System.out.println(d3);

//解析String--->LocalDateTime

LocalDateTime d4 = LocalDateTime.parse("2013-12-31T23:59");

System.out.println(d4);

LocalDateTime d5 = LocalDateTime.parse("2013-12-31T23:59:59.999");//999

秒 等价于999000000纳秒

System.out.println(d5);

//使用DateTimeFormatter API 解析 和 格式化

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd

HH:mm:ss");

LocalDateTime d6 = LocalDateTime.parse("2013/12/31 23:59:59",

formatter);

System.out.println(formatter.format(d6));

//时间获取

System.out.println(d6.getYear());

System.out.println(d6.getMonth());

System.out.println(d6.getDayOfYear());

System.out.println(d6.getDayOfMonth());

System.out.println(d6.getDayOfWeek());

System.out.println(d6.getHour());

System.out.println(d6.getMinute());

System.out.println(d6.getSecond());

System.out.println(d6.getNano());

//时间增减

LocalDateTime d7 = d6.minusDays(1);

LocalDateTime d8 = d7.plus(1, IsoFields.QUARTER_YEARS);

//LocalDate 即年月日 无时分秒

//LocalTime即时分秒 无年月日

//APILocalDateTime类似就不演示了

ZonedDateTime

带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义);APILocalDateTime

似,只是多了时差(2013-12-20T10:35:50.711+08:00[Asia/Shanghai]) //即带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义)。

//APILocalDateTime类似,只是多了时差(2013-12-

20T10:35:50.711+08:00[Asia/Shanghai])

ZonedDateTime now = ZonedDateTime.now();

System.out.println(now);

ZonedDateTime now2= ZonedDateTime.now(ZoneId.of("Europe/Paris"));

System.out.println(now2);

//其他的用法也是类似的 就不介绍了

ZonedDateTime z1 = ZonedDateTime.parse("2013-12-

31T23:59:59Z[Europe/Paris]");

System.out.println(z1);

Duration

表示两个瞬时时间的时间段

//表示两个瞬时时间的时间段

Duration d1 =

Duration.between(Instant.ofEpochMilli(System.currentTimeMillis() - 12323123),

Instant.now());

//得到相应的时差

System.out.println(d1.toDays());

System.out.println(d1.toHours());

System.out.println(d1.toMinutes());

System.out.println(d1.toMillis());

System.out.println(d1.toNanos());

//1天时差 类似的还有如ofHours()

Duration d2 = Duration.ofDays(1);

System.out.println(d2.toDays());

Chronology

用于对年历系统的支持,是java.util.Calendar的替代者

//提供对java.util.Calendar的替换,提供对年历系统的支持

Chronology c = HijrahChronology.INSTANCE;

ChronoLocalDateTime d = c.localDateTime(LocalDateTime.now());

System.out.println(d);

其他

如果提供了年、年月、月日、周期的API支持Year year = Year.now();

YearMonth yearMonth = YearMonth.now();

MonthDay monthDay = MonthDay.now();

System.out.println(year);//

System.out.println(yearMonth); //-

System.out.println(monthDay); // -

//周期,如表示10天前 35个月钱

Period period1 = Period.ofDays(10);

System.out.println(period1);

Period period2 = Period.of(3, 5, 0);

System.out.println(period2);

我们只需要在实体/Bean上使用DateTimeFormat注解:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

private LocalDateTime dateTime;

@DateTimeFormat(pattern = "yyyy-MM-dd")

private LocalDate date;

@DateTimeFormat(pattern = "HH:mm:ss")

private LocalTime time;

比如我们在springmvc中:

@RequestMapping("/test")

public String test(@ModelAttribute("entity") Entity entity) {

return "test";

}

当前端页面请求:

localhost:9080/spring4/test?dateTime=2013-11-11 11:11:11&date=2013-11-11&time=12:12:12

会自动进行类型转换。

另外spring4也提供了对TimeZone的支持;比如在springmvc中注册了LocaleContextResolver相应实现

的话(如CookieLocaleResolver),我们就可以使用如下两种方式得到相应的TimeZone

RequestContextUtils.getTimeZone(request)

LocaleContextHolder.getTimeZone()

不过目前的缺点是不能像Local那样自动的根据当前请求得到相应的TimeZone,如果需要这种功能需要

覆盖相应的如CookieLocaleResolver中的如下方法来得到:

protected TimeZone determineDefaultTimeZone(HttpServletRequest request) {

return getDefaultTimeZone();

}另外还提供了DateTimeContextHolder,其用于线程绑定DateTimeContext;而DateTimeContext提供

了如:ChronologyZoneIdDateTimeFormatter等上下文数据,如果需要这种上下文信息的话,可

以使用这个API进行绑定。比如在进行日期格式化时,就会去查找相应的DateTimeFormatter,因此如

果想自定义相应的格式化格式,那么使用DateTimeContextHolder绑定即可。

spring4只是简单的对jsr310提供了相应的支持,没有太多的增强。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: "b'jackson-datatype-jsr310'" 是一个Java库的名称,它是用于处理日期时间格式的 Jackson 库的一个扩展。这个库可以让开发者更容易地在 Java 应用程序中使用与ISO-8601标准相兼容的日期时间格式。 ### 回答2: Jackson-datatype-jsr310是指Jackson的扩展库,用于支持Java 8新的日期时间API(JSR-310)与Java对象之间的序列化和反序列化。JSR-310Java 8发布的一项新的标准,它提供了一组强类型的日期时间API,解决了Java标准库中日期处理的不足和问题。 在Java中,日期时间相关的类在处理时常常出现各种问题。Java标准库的日期时间类大多是基于旧的Calendar和Date类而来,设计较为复杂,使用不够友好,特别是在进行格式化和解析时,容易出现错误。JSR-310重新定义了新的日期时间API,提供了更多更好用的方法和类,比旧的日期时间API更加强大和易用。 使用Jackson-datatype-jsr310,我们可以将Java对象中的日期时间类型数据序列化到JSON或其他数据格式中,并在反序列化时还原成对应的Java对象。这样就可以方便地在Java和其他语言之间进行数据的交换了。Jackson-datatype-jsr310支持Java 8 API中的LocalDate,LocalDateTime,ZonedDateTime等类型。 例如,在将Java对象转换为JSON字符串的过程中,我们可以使用ObjectMapper的registerModule方法,注册一个JavaTimeModule,它便会将Java 8日期时间类自动序列化成JSON字符串。反序列化时,我们同样可以使用registerModule方法注册JavaTimeModule,并在将JSON字符串转化成Java对象时,自动将日期时间类型还原成对应的Java对象。 总而言之,Jackson-datatype-jsr310是一个非常实用的工具,它可以使得Java程序更加简洁和易维护,尤其是在处理日期时间相关的操作时,更加高效和准确。 ### 回答3: Jackson-datatype-jsr310是一个Java库,用于将Java 8中的JSR310日期时间API(也称为Java时间API)与Jackson JSON处理库集成。这个库的主要目的是提供一种简单的方法将Java时间对象序列化和反序列化为JSON格式。 Java时间APIJava 8中引入的新的日期时间功能,用于替代旧的Date和Calendar类。Java时间API使用不同的类表示日期时间时间段,并提供了一系列强大的方法来进行日期计算和格式化。 Jackson是一个用于处理JSON数据的流行Java库。Jackson提供了强大和高效的序列化和反序列化JSON的功能,由于其高性能和灵活性,成为Java编程中常用的JSON库。 Jackson-datatype-jsr310Java时间API与Jackson集成的过程变得非常容易。使用这个库,您可以轻松地在Java对象和JSON之间转换日期时间时间段。这个库扩展了Jackson的ObjectMapper类,为JSR310类提供了序列化和反序列化的支持。 除了简化Java时间API和Jackson之间的集成之外,Jackson-datatype-jsr310还提供了许多其他功能,例如格式化日期时间的方式完全可以按照自己的意愿来进行自定义配置。 总体来说,Jackson-datatype-jsr310是一个非常有用的Java库,使得Java时间API和Jackson的集成变得非常容易。它提供了灵活、高效、可靠的JSON序列化和反序列化,为Java程序员提供了一种简单而强大的方法来处理日期时间时间段的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向前齐步走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值