前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LocalDate的简单用法介绍

LocalDate的简单用法介绍

作者头像
明明如月学长
发布2021-08-31 15:13:14
7780
发布2021-08-31 15:13:14
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

Java8的特性已经不再是“新特性”,很多Java8的类也逐渐被更多的程序员在使用。

但是项目中的日期工具类,有一些还用的是Calandar类,非常不方便。

本文简单给出几个LocalDate的封装,展示一下基本用法。

大家可以多使用Java 8的时间相关类,功能更强大,代码更简洁。

二、上代码

Demo日期工具类

代码语言:javascript
复制
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.DateTimeFormatter;

import static java.time.temporal.TemporalAdjusters.firstDayOfMonth;

/**
 * @author 明明如月
 * @date 2018/11/14
 */
public class DateUtil {
    public static DateTimeFormatter defaultDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static DateTimeFormatter simpleDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");

    public static DateTimeFormatter defaultFormatterWithTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * '前一天的日期
     */
    public static LocalDate lastDay(String date, DateTimeFormatter dateTimeFormatter) {
        LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);
        return localDate.minusDays(1);
    }

    /**
     * 本周一的日期
     */
    public static LocalDate thisWeekFirstDay(String date, DateTimeFormatter dateTimeFormatter) {
        LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);
        return localDate.with(DayOfWeek.MONDAY);
    }

    /**
     * 上周一
     */
    public static LocalDate lastWeekFirstDay(String date, DateTimeFormatter dateTimeFormatter) {
        LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);
        return localDate.minusDays(7).with(DayOfWeek.MONDAY);
    }

    /**
     * 本月第一天
     */
    public static LocalDate thisMonthFirstDay(String date, DateTimeFormatter dateTimeFormatter) {
        LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);
        return localDate.with(firstDayOfMonth());
    }

    /**
     * 上月第一天
     */
    public static LocalDate lastMonthFirstDay(String date, DateTimeFormatter dateTimeFormatter) {
        LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);
        return localDate.minusMonths(1).with(firstDayOfMonth());
    }

    /**
     * 两个时间之间间隔了多少年
     */
    public static BigDecimal year(long low, long high) {
        Instant instant1 = Instant.ofEpochMilli(low);
        Instant instant2 = Instant.ofEpochMilli(high);

        LocalDate localDate1 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()).toLocalDate();
        LocalDate localDate2 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault()).toLocalDate();
        Period period = Period.between(
                localDate1
                , localDate2
        );
        int years = period.getYears();
        int months = period.getMonths();
        BigDecimal monthToYear = new BigDecimal(months).divide(BigDecimal.valueOf(12), 2, RoundingMode.DOWN);
        return BigDecimal.valueOf(years).add(monthToYear);
    }

    /**
     * 是否是同一天
     */
    public static boolean isSameDateByUnixTime(long time1, long time2) {
        LocalDateTime dateTime1 = Instant.ofEpochMilli(time1).atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime dateTime2 = Instant.ofEpochMilli(time2).atZone(ZoneId.systemDefault()).toLocalDateTime();
        return dateTime1.toLocalDate().isEqual(dateTime2.toLocalDate());
    }

}

测试类

代码语言:javascript
复制
import com.chujianyun.common.java8.date.DateUtil;
import org.junit.Assert;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class DateUtilTest {

    private String today = "2019-05-10";

    private DateTimeFormatter dateTimeFormatter = DateUtil.defaultDateTimeFormatter;

    @Test
    void lastDay() {
        LocalDate localDate = DateUtil.lastDay(today, dateTimeFormatter);
        Assert.assertEquals("2019-05-09", dateTimeFormatter.format(localDate));
    }

    @Test
    void thisWeekFirstDay() {
        LocalDate localDate = DateUtil.thisWeekFirstDay(today, dateTimeFormatter);
        Assert.assertEquals("2019-05-06", dateTimeFormatter.format(localDate));
    }

    @Test
    void lastWeekFirstDay() {
        LocalDate localDate = DateUtil.lastWeekFirstDay(today, dateTimeFormatter);
        Assert.assertEquals("2019-04-29", dateTimeFormatter.format(localDate));
    }

    @Test
    void thisMonthFirstDay() {
        LocalDate localDate = DateUtil.thisMonthFirstDay(today, dateTimeFormatter);
        Assert.assertEquals("2019-05-01", dateTimeFormatter.format(localDate));
    }

    @Test
    void lastMonthFirstDay() {
        LocalDate localDate = DateUtil.lastMonthFirstDay(today, dateTimeFormatter);
        Assert.assertEquals("2019-04-01", dateTimeFormatter.format(localDate));
    }

    @Test
    public void test() throws ParseException {
        // 2018-01-01 --> 1514736000000
        // 2018-01-01 --> 1546272000000

        BigDecimal year = DateUtil.year(1514736000000L, 1546272000000L);
        BigDecimal expect = new BigDecimal(1);
        BigDecimal bigDecimal = expect.setScale(2, BigDecimal.ROUND_HALF_UP);
        Assert.assertEquals(bigDecimal, year);
    }

    @Test
    public void isSameDay() {
        boolean sameDateByUnixTime = DateUtil.isSameDateByUnixTime(1514779260000L, 1514818860000L);
        Assert.assertTrue(sameDateByUnixTime);
    }
}

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、上代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档