对遗留日期时间的支持遗留日期/时间类几乎在所有应用程序中都使用,因此必须有向下兼容 。这就是为什么我们可以通过一些实用方法将遗留类转换为新类,反之亦然 。
//Date转InstantInstant timestamp = new Date().toInstant();//Instant转LocalDateTimeLocalDateTime date = LocalDateTime.ofInstant(timestamp,ZoneId.of(ZoneId.SHORT_IDS.get("CTT")));System.out.println("Date = " + date);//Calendar转InstantInstant time = Calendar.getInstance().toInstant();System.out.println(time);//TimeZone转ZoneIdZoneId defaultZone = TimeZone.getDefault().toZoneId();System.out.println(defaultZone);//ZonedDateTime from specific CalendarZonedDateTime gregorianCalendarDateTime = new GregorianCalendar().toZonedDateTime();System.out.println(gregorianCalendarDateTime);//Date API to Legacy classesDate dt = Date.from(Instant.now());System.out.println(dt);TimeZone tz = TimeZone.getTimeZone(defaultZone);System.out.println(tz);GregorianCalendar gc = GregorianCalendar.from(gregorianCalendarDateTime);System.out.println(gc);
运行之后结果如下:
Date = 2022-10-26T16:47:38.3292022-10-26T08:47:38.429ZAsia/Shanghai2022-10-26T16:47:38.455+08:00[Asia/Shanghai]Wed Oct 26 16:47:38 CST 2022sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null]java.util.GregorianCalendar[time=1666774058455,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2022,MONTH=9,WEEK_OF_YEAR=43,WEEK_OF_MONTH=4,DAY_OF_MONTH=26,DAY_OF_YEAR=299,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=47,SECOND=38,MILLISECOND=455,ZONE_OFFSET=28800000,DST_OFFSET=0]
可以看到,遗留的TimeZone
和GregorianCalendar
类toString()
方法过于冗长,对用户不友好 。
经验总结扩展阅读
- java中的垃圾回收算法与垃圾回收器
- 我终于会写 Java 的定时任务了!
- Java 8 Stream API 引入和使用
- Java并发编程 | Synchronized原理与使用
- javascript编程单线程之同步模式
- java程序员在交接别人的工作时如何保证顺利交接?
- OpenAPI 接口幂等实现
- 都卷Java,你看看你得学多少技术栈才能工作!
- JavaScript函数式编程之函子
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API