Java日期时间API系列23—–Jdk8中java.time包中的新的日期时间API类,获取准确开始时间00:00:00,获取准确结束时间23:59:59等

  有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59。下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第一天开始时间,当前月最后一天结束时间,上个月第一天开始时间,上个月最后一天结束时间,某个指定月的起始结束时间等等。其中月份最后一天往往因为月份不同和闰年而不同。

1  下面是方法:

    /**
     * 一天开始时间 00:00:00
     * @return
     */
    public static LocalTime startTimeOfDay(){
        return LocalTime.of(0, 0, 0);
    }
    
    /**
     * 一天开始时间 23:59:59
     * @return
     */
    public static LocalTime endTimeOfDay(){
        return LocalTime.of(23, 59, 59);
    }
    
    /**
     * 昨天起始时间 即:昨天日期+00:00:00
     * @return
     */
    public static Date startTimeOfYesterday(){
        return DateTimeConverterUtil.toDate(LocalDate.now().minusDays(1).atTime(startTimeOfDay()));
    }
    
    /**
     * 昨天结束时间即:昨天日期+23:59:59
     * @return
     */
    public static Date endTimeOfYesterday(){
        return DateTimeConverterUtil.toDate(LocalDate.now().minusDays(1).atTime(endTimeOfDay()));
    }
    
    /**
     * 今天起始时间 即:今天日期+00:00:00
     * @return
     */
    public static Date startTimeOfToday(){
        return DateTimeConverterUtil.toDate(LocalDate.now().atTime(startTimeOfDay()));
    }
    
    /**
     * 今天结束时间即:今天日期+23:59:59
     * @return
     */
    public static Date endTimeOfToday(){
        return DateTimeConverterUtil.toDate(LocalDate.now().atTime(endTimeOfDay()));
    }
    
    /**
     * 上个月第一天起始时间 即:上个月第一天日期+00:00:00
     * @return
     */
    public static Date startTimeOfLastMonth(){
        return DateTimeConverterUtil.toDate(firstDayOfMonth(LocalDate.now().minusMonths(1)).atTime(startTimeOfDay()));
    }
    
    /**
     * 上个月最后一天结束时间 即:上个月最后一天日期+23:59:59
     * @return
     */
    public static Date endTimeOfLastMonth(){
        return DateTimeConverterUtil.toDate(lastDayOfMonth(LocalDate.now().minusMonths(1)).atTime(endTimeOfDay()));
    }
    
    /**
     * 当月第一天起始时间 即:当月第一天日期+00:00:00
     * @return
     */
    public static Date startTimeOfMonth(){
        return DateTimeConverterUtil.toDate(firstDayOfMonth(LocalDate.now()).atTime(startTimeOfDay()));
    }
    
    /**
     * 当月最后一天结束时间即:当月最后一天日期+23:59:59
     * @return
     */
    public static Date endTimeOfMonth(){
        return DateTimeConverterUtil.toDate(lastDayOfMonth(LocalDate.now()).atTime(endTimeOfDay()));
    }
    
    /**
     * 获date起始时间
     * @param date
     * @return
     */
    public static Date startTimeOfDate(Date date){
        return DateTimeConverterUtil.toDate(DateTimeConverterUtil.toLocalDate(date).atTime(startTimeOfDay()));
    }
    
    /**
     * 获取date结束时间
     * @param date
     * @return
     */
    public static Date endTimeOfDate(Date date){
        return DateTimeConverterUtil.toDate(DateTimeConverterUtil.toLocalDate(date).atTime(endTimeOfDay()));
    }

    /**
     * 获取指定年月的第一天起始时间
     * @param year
     * @param month
     * @return
     */
    public static Date startTimeOfSpecialMonth(int year, int month){
        return DateTimeConverterUtil.toDate(LocalDate.of(year, month, 1).atTime(startTimeOfDay()));
    }
    
    /**
     * 获取指定年月的最后一天结束时间
     * @param year
     * @param month
     * @return
     */
    public static Date endTimeOfSpecialMonth(int year, int month){
        return DateTimeConverterUtil.toDate(lastDayOfMonth(LocalDate.of(year, month, 1)).atTime(endTimeOfDay()));
    }

 

2. 测试代码:

    /**
     * 获取准确的起始时间方法测试
     * 比如startTimeOfMonth() 当月起始时间 当月第一天日期+00:00:00
     *       endTimeOfMonth() 当月最后一天日期+23:59:59
     */
    @Test
    public void dateStartTimeAndEndTimeTest(){
        //当天
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.startTimeOfToday()));
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.endTimeOfToday()));
        
        //当月
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.startTimeOfMonth()));
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.endTimeOfMonth()));
        
        //指定年月
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.startTimeOfSpecialMonth(2019, 10)));
        System.out.println(DateTimeFormatterUtil.formatToDateTimeStr(DateTimeCalculatorUtil.endTimeOfSpecialMonth(2019, 10)));
    }

 

3. 输出:

2020-02-27 00:00:00
2020-02-27 23:59:59
2020-02-01 00:00:00
2020-02-29 23:59:59
2019-10-01 00:00:00
2019-10-31 23:59:59

 

源代码地址:https://github.com/xkzhangsan/xk-time

Java日期时间API系列22—–Jdk8中java.time包中的新的日期时间API类,Month月份和DayOfWeek星期的计算。

  Java8中为月份和星期新增的了,Month和DayOfWeek,来处理月份和星期的特殊问题,这2个类都是枚举类,对Month、DayOfWeek源码说明和简单应用,月份英文,月份英文简称,月份中文,星期英文,星期英文简称,星期中文等。

1.Month

1.1 部分源码:

 * @implSpec
 * This is an immutable and thread-safe enum.
 *
 * @since 1.8
 */
public enum Month implements TemporalAccessor, TemporalAdjuster {

    /**
     * The singleton instance for the month of January with 31 days.
     * This has the numeric value of {@code 1}.
     */
    JANUARY,
    /**
     * The singleton instance for the month of February with 28 days, or 29 in a leap year.
     * This has the numeric value of {@code 2}.
     */
    FEBRUARY,
    /**
     * The singleton instance for the month of March with 31 days.
     * This has the numeric value of {@code 3}.
     */
    MARCH,
    /**
     * The singleton instance for the month of April with 30 days.
     * This has the numeric value of {@code 4}.
     */
    APRIL,

从中可以看出包含了12个月,因为实现了TemporalAccessor和TemporalAdjuster接口,它既有了属性读取和设置,又有加减等功能如下:

 

 

 

 2.应用

为了方便中文环境应用,加一个月份名称的枚举。

package com.xkzhangsan.time.enums;

/**
 * 月份名称枚举,包含英文全称,英文检查,中文全称
 * 
 * @ClassName: MonthNameEnum
 * @Description: MonthNameEnum
 * @author xkzhangsan
 * @date 2020年02月27日
 */
public enum MonthNameEnum {
    
    Jan(1, "January", "一月", "一"),
    Feb(2, "February", "二月", "二"),
    Mar(3, "March", "三月", "三"),
    Apr(4, "April", "四月", "四"),
    May(5, "May", "五月", "五"),
    Jun(6, "June", "六月", "六"),
    Jul(7, "July", "七月", "七"), 
    Aug(8, "August", "八月", "八"),
    Sep(9, "September", "九月", "九"),
    Oct(10, "October", "十月", "十"),
    Nov(11, "November", "十一月", "十一"),
    Dec(12, "December", "十二月", "十二"),;
    
    /**
     * 序号
     */
    private int code;
    
    /**
     * 英文全称
     */
    private String fullNameEn;
    
    /**
     * 中文全称
     */
    private String fullNameCn;
    
    /**
     * 中文简称
     */
    private String shortNameCn;

    
    private MonthNameEnum(int code, String fullNameEn, String fullNameCn, String shortNameCn) {
        this.code = code;
        this.fullNameEn = fullNameEn;
        this.fullNameCn = fullNameCn;
        this.shortNameCn = shortNameCn;
    }

    /**
     * 根据code查询月份名称枚举
     * @param code
     * @return
     */
    public static MonthNameEnum getByCode(int code){
        if(code >=1 && code <= 12){
            for(MonthNameEnum monthNameEnum : MonthNameEnum.values()){
                if(monthNameEnum.getCode() == code){
                    return monthNameEnum;
                }
            }
        }
        return null;
    }
    
    /**
     * 根据code查询月份英文简称
     * @param code
     * @return
     */
    public static String getShortNameEnByCode(int code){
        MonthNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.name() : null;
    }
    
    /**
     * 根据code查询月份英文全称
     * @param code
     * @return
     */
    public static String getFullNameEnByCode(int code){
        MonthNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.getFullNameEn() : null;
    }
    
    /**
     * 根据code查询月份中文全称
     * @param code
     * @return
     */
    public static String getFullNameCnByCode(int code){
        MonthNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.getFullNameCn() : null;
    }
    
    /**
     * 根据code查询月份中文
     * @param code
     * @return
     */
    public static String getShortNameCnByCode(int code){
        MonthNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.getShortNameCn() : null;
    }

    public int getCode() {
        return code;
    }

    public String getFullNameEn() {
        return fullNameEn;
    }

    public String getFullNameCn() {
        return fullNameCn;
    }

    public String getShortNameCn() {
        return shortNameCn;
    }

}

 

应用代码

    /**
     * 获取月, 比如 1
     * @param date
     * @return
     */
    public static int getMonth(Date date){
        return DateTimeConverterUtil.toLocalDateTime(date).getMonthValue();
    }
    
    /**
     * 获取月, 比如 1
     * @param instant
     * @return
     */
    public static int getMonth(Instant instant){
        return DateTimeConverterUtil.toLocalDateTime(instant).getMonthValue();
    }
    
    /**
     * 获取月, 比如 1
     * LocalDateTime LocalDate ZonedDateTime 可以直接getMonthValue()
     * @param localDateTime
     * @return
     */
    public static int getMonth(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return localDateTime.getMonthValue();
    }
    
    
    
    /**
     * 获取月英文全称, 比如 January
     * January, February, March, April, May, June, July, August, September, October,
     * November and December
     * @param date
     * @return
     */
    public static String getMonthEnLong(Date date){
        return MonthNameEnum.getFullNameEnByCode(getMonth(date));
    }
    
    /**
     * 获取月英文全称, 比如 January
     * January, February, March, April, May, June, July, August, September, October,
     * November and December
     * @param instant
     * @return
     */
    public static String getMonthEnLong(Instant instant){
        return MonthNameEnum.getFullNameEnByCode(getMonth(instant));
    }
    
    /**
     * 获取月英文全称, 比如 January
     * January, February, March, April, May, June, July, August, September, October,
     * November and December
     * LocalDateTime LocalDate ZonedDateTime 可以直接.getMonth().toString()
     * @param localDateTime
     * @return
     */
    public static String getMonthEnLong(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return MonthNameEnum.getFullNameEnByCode(getMonth(localDateTime));
    }
    
    /**
     * 获取月英文简称, 比如 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
     * @param date
     * @return
     */
    public static String getMonthEnShort(Date date){
        return MonthNameEnum.getShortNameEnByCode(getMonth(date));
    }
    
    /**
     * 获取月英文简称, 比如 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
     * @param instant
     * @return
     */
    public static String getMonthEnShort(Instant instant){
        return MonthNameEnum.getShortNameEnByCode(getMonth(instant));
    }
    
    /**
     * 获取月英文简称, 比如 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
     * @param localDateTime
     * @return
     */
    public static String getMonthEnShort(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return MonthNameEnum.getShortNameEnByCode(getMonth(localDateTime));
    }
    
    /**
     * 获取月份中文全称, 比如一月
     * @param date
     * @return
     */
    public static String getMonthCnLong(Date date){
        return MonthNameEnum.getFullNameCnByCode(getMonth(date));
    }
    
    /**
     * 获取月份中文全称, 比如一月
     * @param instant
     * @return
     */
    public static String getMonthCnLong(Instant instant){
        return MonthNameEnum.getFullNameCnByCode(getMonth(instant));
    }
    
    /**
     * 获取月份中文全称, 比如一月
     * @param localDateTime
     * @return
     */
    public static String getMonthCnLong(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return MonthNameEnum.getFullNameCnByCode(getMonth(localDateTime));
    }
    
    /**
     * 获取月份中文全称, 比如一
     * @param date
     * @return
     */
    public static String getMonthCnShort(Date date){
        return MonthNameEnum.getShortNameCnByCode(getMonth(date));
    }
    
    /**
     * 获取月份中文全称, 比如一
     * @param instant
     * @return
     */
    public static String getMonthCnShort(Instant instant){
        return MonthNameEnum.getShortNameCnByCode(getMonth(instant));
    }
    
    /**
     * 获取月份中文全称, 比如一
     * @param localDateTime
     * @return
     */
    public static String getMonthCnShort(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return MonthNameEnum.getShortNameCnByCode(getMonth(localDateTime));
    }

测试代码:

    /**
     * 获取月份信息,包括英文全称简称,中文等
     */
    @Test
    public void dateGetMonthTest(){
        Date date = new Date();
        System.out.println(date);
        
        System.out.println(DateTimeCalculatorUtil.getMonth(date));
        System.out.println(DateTimeCalculatorUtil.getMonthEnLong(date));
        System.out.println(DateTimeCalculatorUtil.getMonthEnShort(date));
        System.out.println(DateTimeCalculatorUtil.getMonthCnLong(date));
        System.out.println(DateTimeCalculatorUtil.getMonthCnShort(date));
    }

 

输出结果:

Thu Feb 27 16:01:59 CST 2020
2
February
Feb
二月
二

 

2.DayOfWeek

2.1  部分源码

 * @implSpec
 * This is an immutable and thread-safe enum.
 *
 * @since 1.8
 */
public enum DayOfWeek implements TemporalAccessor, TemporalAdjuster {

    /**
     * The singleton instance for the day-of-week of Monday.
     * This has the numeric value of {@code 1}.
     */
    MONDAY,
    /**
     * The singleton instance for the day-of-week of Tuesday.
     * This has the numeric value of {@code 2}.
     */
    TUESDAY,
    /**
     * The singleton instance for the day-of-week of Wednesday.
     * This has the numeric value of {@code 3}.
     */
    WEDNESDAY,
    /**
     * The singleton instance for the day-of-week of Thursday.
     * This has the numeric value of {@code 4}.
     */
    THURSDAY,
    /**
     * The singleton instance for the day-of-week of Friday.
     * This has the numeric value of {@code 5}.
     */
    FRIDAY,
    /**
     * The singleton instance for the day-of-week of Saturday.
     * This has the numeric value of {@code 6}.
     */
    SATURDAY,
    /**
     * The singleton instance for the day-of-week of Sunday.
     * This has the numeric value of {@code 7}.
     */
    SUNDAY;

从中可以看出包含了星期一到星期日,因为实现了TemporalAccessor和TemporalAdjuster接口,它它既有了属性读取和设置,又有加减等功能如下:

 

 

 2.2 应用

为了方便中文环境应用,加一个星期名称的枚举。

package com.xkzhangsan.time.enums;

/**
 * 星期名称枚举,包含英文全称,英文检查,中文
 * Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday
 * @ClassName: WeekNameEnum
 * @Description: WeekNameEnum
 * @author xkzhangsan
 * @date 2020年02月27日
 */
public enum WeekNameEnum {
    
    Mon(1, "Monday", "星期一"),
    Tue(2, "Tuesday", "星期二"),
    Wed(3, "Wednesday", "星期三"),
    Thu(4, "Thursday", "星期四"),
    Fri(5, "Friday", "星期五"),
    Sat(6, "Saturday", "星期六"),
    Sun(7, "Sunday", "星期日"),;
    
    /**
     * 序号
     */
    private int code;
    
    /**
     * 英文全称
     */
    private String fullNameEn;
    
    /**
     * 中文
     */
    private String nameCn;
    

    private WeekNameEnum(int code, String fullNameEn, String nameCn) {
        this.code = code;
        this.fullNameEn = fullNameEn;
        this.nameCn = nameCn;
    }

    /**
     * 根据code查询星期名称枚举
     * @param code
     * @return
     */
    public static WeekNameEnum getByCode(int code){
        if(code >=1 && code <= 12){
            for(WeekNameEnum monthNameEnum : WeekNameEnum.values()){
                if(monthNameEnum.getCode() == code){
                    return monthNameEnum;
                }
            }
        }
        return null;
    }
    
    /**
     * 根据code查询星期英文简称
     * @param code
     * @return
     */
    public static String getShortNameEnByCode(int code){
        WeekNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.name() : null;
    }
    
    /**
     * 根据code查询星期英文全称
     * @param code
     * @return
     */
    public static String getFullNameEnByCode(int code){
        WeekNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.getFullNameEn() : null;
    }
    
    /**
     * 根据code查询星期中文名称
     * @param code
     * @return
     */
    public static String getNameCnByCode(int code){
        WeekNameEnum monthNameEnum = getByCode(code);
        return monthNameEnum != null ? monthNameEnum.getNameCn() : null;
    }

    public int getCode() {
        return code;
    }

    public String getFullNameEn() {
        return fullNameEn;
    }

    public String getNameCn() {
        return nameCn;
    }


}

 

应用代码:

    /**
     * 获取星期值 1-7,星期一到星期日
     * @param date
     * @return
     */
    public static int getDayOfWeek(Date date){
        return DateTimeConverterUtil.toLocalDateTime(date).getDayOfWeek().getValue();
    }
    
    /**
     * 获取星期值 1-7,星期一到星期日
     * @param localDateTime
     * @return
     */
    public static int getDayOfWeek(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return localDateTime.getDayOfWeek().getValue();
    }
    
    /**
     * 获取星期值 1-7,星期一到星期日
     * @param localDate
     * @return
     */
    public static int getDayOfWeek(LocalDate localDate){
        Objects.requireNonNull(localDate, "localDate");
        return localDate.getDayOfWeek().getValue();
    }    
    
    /**
     * 获取星期值 1-7,星期一到星期日
     * @param instant
     * @return
     */
    public static int getDayOfWeek(Instant instant){
        return DateTimeConverterUtil.toLocalDateTime(instant).getDayOfWeek().getValue();
    }
    
    /**
     * 获取星期英文全称,比如Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday
     * @param date
     * @return
     */
    public static String getDayOfWeekEnLong(Date date){
        return WeekNameEnum.getFullNameEnByCode(getDayOfWeek(date));
    }
    
    /**
     * 获取星期英文全称,比如Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday
     * @param localDateTime
     * @return
     */
    public static String getDayOfWeekEnLong(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return WeekNameEnum.getFullNameEnByCode(getDayOfWeek(localDateTime));
    }
    
    /**
     * 获取星期英文全称,比如Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday
     * @param localDate
     * @return
     */
    public static String getDayOfWeekEnLong(LocalDate localDate){
        Objects.requireNonNull(localDate, "localDate");
        return WeekNameEnum.getFullNameEnByCode(getDayOfWeek(localDate));
    }    
    
    /**
     * 获取星期英文全称,比如Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday
     * @param instant
     * @return
     */
    public static String getDayOfWeekEnLong(Instant instant){
        return WeekNameEnum.getFullNameEnByCode(getDayOfWeek(instant));
    }
    
    /**
     * 获取星期英文简称,比如Mon
     * @param date
     * @return
     */
    public static String getDayOfWeekEnShort(Date date){
        return WeekNameEnum.getShortNameEnByCode(getDayOfWeek(date));
    }
    
    /**
     * 获取星期英文简称,比如Mon
     * @param localDateTime
     * @return
     */
    public static String getDayOfWeekEnShort(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return WeekNameEnum.getShortNameEnByCode(getDayOfWeek(localDateTime));
    }
    
    /**
     * 获取星期英文简称,比如Mon
     * @param localDate
     * @return
     */
    public static String getDayOfWeekEnShort(LocalDate localDate){
        Objects.requireNonNull(localDate, "localDate");
        return WeekNameEnum.getShortNameEnByCode(getDayOfWeek(localDate));
    }    
    
    /**
     * 获取星期英文简称,比如Mon
     * @param instant
     * @return
     */
    public static String getDayOfWeekEnShort(Instant instant){
        return WeekNameEnum.getShortNameEnByCode(getDayOfWeek(instant));
    }    
    
    
    /**
     * 获取星期中文,比如星期一
     * @param date
     * @return
     */
    public static String getDayOfWeekCn(Date date){
        return WeekNameEnum.getNameCnByCode(getDayOfWeek(date));
    }
    
    /**
     * 获取星期中文,比如星期一
     * @param localDateTime
     * @return
     */
    public static String getDayOfWeekCn(LocalDateTime localDateTime){
        Objects.requireNonNull(localDateTime, "localDateTime");
        return WeekNameEnum.getNameCnByCode(getDayOfWeek(localDateTime));
    }
    
    /**
     * 获取星期中文,比如星期一
     * @param localDate
     * @return
     */
    public static String getDayOfWeekCn(LocalDate localDate){
        Objects.requireNonNull(localDate, "localDate");
        return WeekNameEnum.getNameCnByCode(getDayOfWeek(localDate));
    }    
    
    /**
     * 获取星期中文,比如星期一
     * @param instant
     * @return
     */
    public static String getDayOfWeekCn(Instant instant){
        return WeekNameEnum.getNameCnByCode(getDayOfWeek(instant));
    }

 

测试代码:

    /**
     * 获取星期信息,包括英文全称简称,中文等
     */
    @Test
    public void dateGetWeekTest(){
        Date date = new Date();
        System.out.println(date);
        
        System.out.println(DateTimeCalculatorUtil.getDayOfWeek(date));
        System.out.println(DateTimeCalculatorUtil.getDayOfWeekEnLong(date));
        System.out.println(DateTimeCalculatorUtil.getDayOfWeekEnShort(date));
        System.out.println(DateTimeCalculatorUtil.getDayOfWeekCn(date));
    }

 

输出:

Thu Feb 27 16:09:00 CST 2020
4
Thursday
Thu
星期四

 

源代码地址:https://github.com/xkzhangsan/xk-time