深度思考JDK8中日期类型该如何使用详解
JDK8引入了新的日期和时间API,旨在取代原先的Date和Calendar类。新的API提供了更好的易用性和可读性,同时也更加严格和健壮。在使用时间和日期时,应该尽量使用新的API。
LocalDate
LocalDate是新API中表示日期的主要类。它是一个不可变的类,用于表示ISO-8601日历系统中的日期(年、月、日)。以下是创建和使用LocalDate对象的示例:
// 创建LocalDate对象
LocalDate date1 = LocalDate.now(); // 当前日期
LocalDate date2 = LocalDate.of(2021, 12, 31); // 自定义日期
// 获取年、月、日
int year = date1.getYear(); // 2021
Month month = date1.getMonth(); // SEPTEMBER
int day = date1.getDayOfMonth(); // 22
// 格式化日期
String format1 = date1.format(DateTimeFormatter.BASIC_ISO_DATE); // 20210922
String format2 = date1.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2021-09-22
LocalTime
LocalTime是新API中表示时间的主要类。它也是一个不可变的类,用于表示ISO-8601日历系统中的时间(小时、分钟、秒和纳秒)。以下是创建和使用LocalTime对象的示例:
// 创建LocalTime对象
LocalTime time1 = LocalTime.now(); // 当前时间
LocalTime time2 = LocalTime.of(12, 30, 0, 0); // 自定义时间
// 获取小时、分钟、秒、纳秒
int hour = time1.getHour(); // 14
int minute = time1.getMinute(); // 23
int second = time1.getSecond(); // 45
int nano = time1.getNano(); // 123456789
// 格式化时间
String format1 = time1.format(DateTimeFormatter.ISO_LOCAL_TIME); // 14:23:45.123456789
String format2 = time1.format(DateTimeFormatter.ofPattern("HH:mm:ss.SSS")); // 14:23:45.123
LocalDateTime
LocalDateTime是新API中表示日期和时间的主要类。它是LocalDate和LocalTime的结合体,表示一个日期和时间。以下是创建和使用LocalDateTime对象的示例:
// 创建LocalDateTime对象
LocalDateTime datetime1 = LocalDateTime.now(); // 当前日期和时间
LocalDateTime datetime2 = LocalDateTime.of(2021, Month.DECEMBER, 31, 23, 59, 59); // 自定义日期和时间
// 提取日期和时间
LocalDate date = datetime1.toLocalDate();
LocalTime time = datetime1.toLocalTime();
// 格式化日期和时间
String format1 = datetime1.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); // 2021-09-22T14:23:45.123456789
String format2 = datetime1.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); // 2021/09/22 14:23:45
Instant
Instant是新API中表示时间戳的主要类。它表示自1970年1月1日00:00:00.000 UTC(协调世界时)以来的秒数和纳秒数。以下是创建和使用Instant对象的示例:
// 创建Instant对象
Instant instant1 = Instant.now(); // 当前时间戳
Instant instant2 = Instant.ofEpochSecond(1632300000L); // 自定义时间戳(2021-09-22 14:00:00)
// 提取秒数和纳秒数
long epochSeconds = instant1.getEpochSecond(); // 1632320639
int nano = instant1.getNano(); // 981789986
// Instant与LocalDateTime互转
LocalDateTime datetime = LocalDateTime.ofInstant(instant1, ZoneOffset.UTC);
Instant instant = datetime.toInstant(ZoneOffset.UTC);
// 格式化时间戳
String format1 = instant1.toString(); // 2021-09-22T06:23:59.981789986Z
String format2 = instant1.atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); // 2021/09/22 14:23:59
示例1:计算两个日期之间的天数
使用LocalDate可以很容易地计算两个日期之间的天数,如下所示:
LocalDate date1 = LocalDate.of(2020, 1, 1);
LocalDate date2 = LocalDate.of(2021, 9, 22);
long daysBetween = ChronoUnit.DAYS.between(date1, date2);
System.out.println(daysBetween); // 630
示例2:处理时区和夏令时
在处理跨时区的时间时,可以使用ZoneOffset或ZoneId对象来进行转换。以下是一个将UTC时间转化为北京时间的示例:
Instant instant = Instant.now(); // 获取当前时间戳
ZonedDateTime utc = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); // 转化为UTC时间
ZonedDateTime beijing = utc.withZoneSameInstant(ZoneId.of("Asia/Shanghai")); // 转化为北京时间
System.out.println("UTC: " + utc);
System.out.println("北京时间: " + beijing);
输出结果如下:
UTC: 2021-09-22T06:50:59.041764Z[UTC]
北京时间: 2021-09-22T14:50:59.041764+08:00[Asia/Shanghai]
以上就是对JDK8中日期类型的详细介绍和使用攻略。在实际开发中,需要结合具体的业务需求来选择和使用适当的日期类型和方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度思考JDK8中日期类型该如何使用详解 - Python技术站