《Java核心技术 卷II》本地日期

本地日期

从绝对时间转向人类时间,JavaAPI中两类人类时间。

本地日期/时间:包含当天的日期和时间,与时区信息没有任何关联,并不对应精准的时刻。1903年6月14日。

时区日期/时间:包括时区,表示时间线上的一个精确的时刻。1969年7月16日 09:32:00 EDT(阿波罗11号发射的时刻)。

API设计者推荐程序员不要使用时区时间,除非想要表示绝对时间的实例。

生日,假期,计划时间通常做好表示为本地日期时间。

LocalDate是带有年、月、日的日期

构建LocalDate对象,可以使用now和of静态方法

LocalDate today = LocalDate.now();//今天的日期
LocalDate alonzosBirthday = LocalDate.of(1903,6,14);
alonzosBirthday = LocalDate.of(1903,Month.JUNE,14);//用月份的枚举
程序员日是每年的第256天
LocalDate programmersDay = LocalDate.of(2014,1,1).plusDays(255);

两个Instant之间的时长是Duration,而用于本地日期的等价物是Period,表示流逝的年,月,日的数量。

birthday.plus(Period.ofYears(1))来获取下一年的生日。

可以直接调用birthday.plusYears(1)。

警告:LocalDate API中的有些方法可能会创建出并不存在的日期。

例如:1月31日加上1个月不应该产生2月31日,不会抛出异常,而会返回该月有效的最后一天。

LocalDate.of(2016,1,31).plusMonths(1)
LocalDate.of(2016,3,31).minusMonths(1)
//都将产生2016年2月29日

getDayOfWeek会产生星期日期,即DayOfWeek枚举的某个值。

DayOfWeek.MONDAY的枚举值是1.

DayOfWeek.SUNDAY的枚举值是7.

注释:周末实际上在每周的末尾,这与Calendar有所差异,后者星期日为1,星期六为7.

Java9添加了两个有用的datesUntil方法,会产生LocalDate对象流。

LocalDate start = LocalDate.of(2000,1,1);
LocalDate endExclusive = LocalDate.now();
Stream<LocalDate> allDays = start.datesUntil(endExclusive);
Stream<LocalDate> firstDaysInMonth = start.datesUntil(endExclusive,Period.ofMonths(1));

除了LocalDate之外,还有MonthDay、YearMonth、Year类可以描述部分日期。

例如,12月25日没有指定年份,可以表示成一个MonthDay对象。

使用LocalDate类
package 第6章时间API.localdates;

import java.lang.reflect.AccessFlag.Location;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.stream.Stream;

public class Localdates {

    public static void main(String[] args) {
        // 今天的日期
        LocalDate today = LocalDate.now();
        System.out.println("今天: " + today);

        LocalDate alonzosBirthday = LocalDate.of(1903, 6, 14);
        alonzosBirthday = LocalDate.of(1903, Month.JUNE, 14);
        System.out.println("阿隆佐.丘齐的生日: " + alonzosBirthday);

        LocalDate programmersDay = LocalDate.of(2018, 1, 1).plusDays(255);
        // 闰年会多一天
        System.out.println("程序员日: " + programmersDay);
        // 国庆节
        LocalDate nationalDay = LocalDate.of(2024, Month.OCTOBER, 1);
        // 春节
        LocalDate springFestival = LocalDate.of(2025, Month.JANUARY, 29);
        System.out.println("国庆到春节还有: " + nationalDay.until(springFestival));
        System.out.println("国庆到春节还有: " + nationalDay.until(springFestival, ChronoUnit.DAYS));
        // 整月加减,若不存在,默认最后一天。
        System.out.println(LocalDate.of(2024, 1, 31).plusMonths(1));
        System.out.println(LocalDate.of(2024, 3, 31).minusMonths(1));
        // 获取某天是星期几
        DayOfWeek gcl = LocalDate.of(1990, 12, 20).getDayOfWeek();
        System.out.println("郜子的生日当天是星期几: " + gcl);
        System.out.println(gcl.getValue());
        System.out.println(DayOfWeek.SATURDAY.plus(3));
        // 每月第一天列表
        LocalDate start = LocalDate.of(2000, 1, 1);
        LocalDate endExclusive = LocalDate.now();
        Stream<LocalDate> firstDaysInMonth = start.datesUntil(endExclusive, Period.ofMonths(1));
        System.out.println("每月第一天: " + firstDaysInMonth.toList());
        // 每月最后一天列表
        LocalDate start2 = LocalDate.of(2000, 1, 31);
        LocalDate endExclusive2 = LocalDate.now();
        Stream<LocalDate> lastDaysInMonth = start2.datesUntil(endExclusive2, Period.ofMonths(1));
        System.out.println("每月最后一天: " + lastDaysInMonth.toList());
    }

}

若项目中需要,直接查API。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿立聊全栈

有作用的,有闲钱的支持一点。

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

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

打赏作者

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

抵扣说明:

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

余额充值