Java 使用 ZoneId 来标识不同的时区,从基准 UTC 开始的一个固定偏移 。
创建一个ZonedDateTime实例
//使用当前时间作为值新建对象ZonedDateTime dateTime = ZonedDateTime.now();//使用指定的年月日、时分、纳秒以及时区ID来新建对象//时区是用ZoneId类表示的,可以使用ZoneId.now()或ZoneId.of(“xxx”)来实例化://传给of()方法的参数是时区的ID,如“UTC+1”指距离UTC(格林威治时间)有一小时的时差ZoneId zoneId = ZoneId.of("UTC+1");ZonedDateTime dateTime2 = ZonedDateTime.of(2019, 6, 1, 14, 40, 48, 1234, zoneId);//也可以使用另一种方式表示zone id,即使用地区名字ZoneId zoneId2 = ZoneId.of("Europe/Copenhagen");//GregorianCalendar与ZonedDateTime相互转换ZonedDateTime zonedDateTime = new GregorianCalendar().toZonedDateTime();GregorianCalendar.from(zonedDateTime);TemporalAdjusters
有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天 。
【全面解析Java日期时间API】简单应用例子
LocalDate localDate = LocalDate.now(); // 1. 本月第一天LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());// 2. 本月最后一天LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());// 3. 本年第一天LocalDate firstDayOfYear = localDate.with(TemporalAdjusters.firstDayOfYear());// 4. 下个月第一天LocalDate firstDayOfNextMonth = localDate.with(TemporalAdjusters.firstDayOfNextMonth());// 5. 本年度最后一天LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());System.out.println(firstDayOfMonth);System.out.println(lastDayOfMonth);System.out.println(firstDayOfYear);System.out.println(firstDayOfNextMonth);System.out.println(lastDayOfYear);这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更加灵活地处理日期 。TemporalAdjusters类通过静态方法提供了大量的常用的TemporalAdjuster的实现供我们使用 。
/** * 时间校正器TemporalAdjuster */@Testpublic void Test() { LocalDateTime now1 = LocalDateTime.now(); //获取月中的第一天 now1.with(TemporalAdjusters.firstDayOfMonth()); //获取下一年的第一天now1.with(TemporalAdjusters.firstDayOfNextYear()); //获取年中第一天 now1.with(TemporalAdjusters.lastDayOfYear()); //获取月中最后一天 now1.with(TemporalAdjusters.lastDayOfMonth()); //获取下个星期一 now1.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); //自定时时间:下一个工作日,因为这里需要一个接口,所以完全可以自定义方法 now1.with((e) -> { LocalDateTime now = (LocalDateTime)e;DayOfWeek dow = now.getDayOfWeek(); if (dow.equals(DayOfWeek.FRIDAY))return now.plusDays(3); else if (dow.equals(DayOfWeek.SATURDAY)) return now.plusDays(2); return now.plusDays(1); });}转换
java.util.Date 与 LocalDate、LocalTime、LocalDateTime 转换
将Date转换为LocalDate,LocalTime,LocalDateTime可以借助于ZonedDateTime和Instant,实现如下:
Date date = new Date();System.out.println("current date: " + date);// Date -> LocalDateTimeLocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();System.out.println("localDateTime by Instant: " + localDateTime);// Date -> LocalDateLocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();System.out.println("localDate by Instant: " + localDate);// Date -> LocalTimeLocalTime localTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();System.out.println("localTime by Instant: " + localTime);//2. Date -> LocalDateTimelocalDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());System.out.println("localDateTime by ofInstant: " + localDateTime);由于JDK8实现了向下兼容,所以Date里在JDK8版本引入了2个方法,from和
toInstant,所以我们可以借助这两个方法来实现LocalDateTime到Date的转换 。将LocalDateTime转为Date如下:
LocalDateTime localDateTime = LocalDateTime.now();System.out.println("localDateTime: " + localDateTime);// LocalDateTime -> DateDate date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());System.out.println("LocalDateTime -> current date: " + date);// LocalDate -> Date,时间默认都是00LocalDate localDate = LocalDate.now();date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());System.out.println("LocalDate -> current date: " + date);日期与字符串的转换
通过LocalDate,LocalTime,LocalDateTime的parse方法和DateTimeFormatter来实现:
//字符串->日期LocalDate localDate = LocalDate.parse("2018-09-09", DateTimeFormatter.ofPattern("yyyy-MM-dd"));LocalDateTime localDateTime = LocalDateTime.parse("2018-09-10 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//日期->字符串String localDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));String localDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));// 也可以通过DateTimeFormatter的format方法DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");localDateTime = dateTimeFormatter.format(LocalDateTime.now());
推荐阅读
- 35个可以飞快提高千倍效率的Java语言代码小技巧,你值得拥有!
- Web实现前后端分离解析
- 8个品牌!全面关闭手机广告教程来了:手机终于清静
- 你不知道的文昌塔风水解析
- 强力推荐几个编写高性能的JavaScript 的小建议
- 五个典型的JavaScript面试题
- Java 字节码加密工具 ClassFinal
- 建议收藏 Nginx的DNS解析详细过程分析
- Java这些运算规则和注意事项你确定都知道吗?
- 走进弗洛伊德的《梦的解析》 佛洛依德 梦的解析
