package com.aq.day01;
import java.time.*;
import java.time.format.DateTimeFormatter;
/**
* @author 坏小子
* @date 2022/1/19 : 15:16
* @Description :TODO
*/
public class RunableText {
public static void main(String[] args) {
//当前日期和时间
LocalDateTime now = LocalDateTime.now();
//当前时间
LocalTime time = LocalTime.now();
//当前日期
LocalDate date = LocalDate.now();
//根据当前日期和时间来获取日期和时间
LocalDate date1 = now.toLocalDate();
LocalTime time1 = now.toLocalTime();
//通过指定的日期和时间创建LocalDateTime可以通过of()方法
LocalDate d2 = LocalDate.of(2019, 11, 30); // 2019-11-30, 注意11=11月
LocalTime t2 = LocalTime.of(15, 16, 17); // 15:16:17
LocalDateTime dt2 = LocalDateTime.of(2019, 11, 30, 15, 16, 17);
LocalDateTime dt3 = LocalDateTime.of(d2, t2);
//自定义输出的格式 DateTimeFormatter
// 自定义格式化:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// 用自定义格式解析:
LocalDateTime dt4 = LocalDateTime.parse("2019/11/30 15:16:17", dtf);
//进行加减的非常简单的链式调用 对日期和时间进行调整则使用withXxx()方法,例如:withHour(15)会把10:11:12变为15:11:12
/**
* 调整年:withYear()
* 调整月:withMonth()
* 调整日:withDayOfMonth()
* 调整时:withHour()
* 调整分:withMinute()
* 调整秒:withSecond()
*/
// 日期变为31日:
LocalDateTime dt5 = now.withDayOfMonth(31);
// 月份变为9:
LocalDateTime dt6 = dt2.withMonth(9);
//判断两个LocalDateTime的先后,可以使用isBefore()、isAfter()方法,对于LocalDate和LocalTime
LocalDateTime target = LocalDateTime.of(2019, 11, 19, 8, 15, 0);
System.out.println(now.isBefore(target));
System.out.println(LocalDate.now().isBefore(LocalDate.of(2019, 11, 19)));
System.out.println(LocalTime.now().isAfter(LocalTime.parse("08:15:00")));
//Duration表示两个时刻之间的时间间隔。另一个类似的Period表示两个日期之间的天数
LocalDateTime start = LocalDateTime.of(2019, 11, 19, 8, 15, 0);
LocalDateTime end = LocalDateTime.of(2020, 1, 9, 19, 25, 30);
Duration d = Duration.between(start, end);
System.out.println(d); // PT1235H10M30S
Period p = LocalDate.of(2019, 11, 19).until(LocalDate.of(2020, 1, 9));
System.out.println(p); // P1M21D
// 总是表示本地日期和时间,要表示一个带时区的日期和时间,我们就需要ZonedDateTime。
//
// 可以简单地把ZonedDateTime理解成LocalDateTime加ZoneId。ZoneId是java.time引入的新的时区类,注意和旧的java.util.TimeZone区别。
//
// 要创建一个ZonedDateTime对象,有以下几种方法,一种是通过now() 方法返回当前时间:
//
// 此代码由 【Java 技术驿站】整理
// import java.time. *;
// ----
// public class Main {
// public static void main(String[] args) {
// ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区
// ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York")); // 用指定时区获取当前时间
// System.out.println(zbj);
// System.out.println(zny);
// }
// }
//
// 观察打印的两个ZonedDateTime,发现它们时区不同,但表示的时间都是同一时刻(毫秒数不同是执行语句时的时间差):
//
// 此代码由 【Java 技术驿站】整理
// 2019 - 09 - 15 T20:
// 58:18.786182 + 08:00[Asia / Shanghai]
// 2019 - 09 - 15 T08:
// 58:18.788860 - 04:00[America / New_York]
//
// 另一种方式是通过给一个LocalDateTime附加一个ZoneId,就可以变成ZonedDateTime:
//
// 此代码由 【Java 技术驿站】整理
// import java.time. *;
// ----
// public class Main {
// public static void main(String[] args) {
// LocalDateTime ldt = LocalDateTime.of(2019, 9, 15, 15, 16, 17);
// ZonedDateTime zbj = ldt.atZone(ZoneId.systemDefault());
// ZonedDateTime zny = ldt.atZone(ZoneId.of("America/New_York"));
// System.out.println(zbj);
// System.out.println(zny);
// }
// }
//
// 以这种方式创建的ZonedDateTime,它的日期和时间与LocalDateTime相同,但附加的时区不同,因此是两个不同的时刻:
//
// 此代码由 【Java 技术驿站】整理
// 2019 - 09 - 15 T15:
// 16:17 + 08:00[Asia / Shanghai]
// 2019 - 09 - 15 T15:
// 16:17 - 04:00[America / New_York]
//
// 时区转换
// 要转换时区,首先我们需要有一个ZonedDateTime对象,然后,通过withZoneSameInstant() 将关联时区转换到另一个时区,转换后日期和时间都会相应调整。
//
// 下面的代码演示了如何将北京时间转换为纽约时间:
//
// 此代码由 【Java 技术驿站】整理
// import java.time. *;
// ----
// public class Main {
// public static void main(String[] args) {
// // 以中国时区获取当前时间:
// ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// // 转换为纽约时间:
// ZonedDateTime zny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
// System.out.println(zbj);
// System.out.println(zny);
// }
// }
//
// 要特别注意,时区转换的时候,由于夏令时的存在,不同的日期转换的结果很可能是不同的。这是北京时间9月15日的转换结果:
//
// 此代码由 【Java 技术驿站】整理
// 2019 - 09 - 15 T21:
// 05:50.187697 + 08:00[Asia / Shanghai]
// 2019 - 09 - 15 T09:
// 05:50.187697 - 04:00[America / New_York]
//
// 这是北京时间11月15日的转换结果:
//
// 此代码由 【Java 技术驿站】整理
// 2019 - 11 - 15 T21:
// 05:50.187697 + 08:00[Asia / Shanghai]
// 2019 - 11 - 15 T08:
// 05:50.187697 - 05:00[America / New_York]
//
// 两次转换后的纽约时间有1小时的夏令时时差。
//
// 此代码由 【Java 技术驿站】整理
// 涉及到时区时,千万不要自己计算时差,否则难以正确处理夏令时。
//
// 有了ZonedDateTime,将其转换为本地时间就非常简单:
//
// 此代码由 【Java 技术驿站】整理
// ZonedDateTime zdt = ...
// LocalDateTime ldt = zdt.toLocalDateTime();
//
// 转换为LocalDateTime时,直接丢弃了时区信息。
}
}