Java8 Lambda表达式获取当前时间之前的多少天

1.获取当前时间之前的多少天

package lenovo.util;


import org.springframework.util.ObjectUtils;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

public class DateUtils {


    public static List<String> getBeforeValueDate(Integer value) {
        if (ObjectUtils.isEmpty(value) && value < 1) {
            value = 1;
        }

        LocalTime localTime = LocalTime.of(12, 10);
        List<String> list = new ArrayList<>();
        for (int i = 0; i < value; i++) {
            if (LocalTime.now().isBefore(localTime)) {
                LocalDateTime now = LocalDateTime.now().plusDays(-1);
                now = now.minus(i, ChronoUnit.DAYS);
                list.add(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            } else if (LocalTime.now().isAfter(localTime)) {
                LocalDateTime now = LocalDateTime.now();
                now = now.minus(i, ChronoUnit.DAYS);
                list.add(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            }
        }
        return list;
    }

}

2.Java 8 时间API

在Java8之前,Java中对于日期的操作是不够那么方面的。比如对日期进行加减操作、对日期的格式化、对日期的大小进行判断等。所以会出现Joda Time工具包来帮我们解决问题。
Java8之后,就不需要再引入第三方工具包来处理日期了。
刚开始的时候,看着新的API还是非常不适应的,习惯了之后就会爱上他了。

1.对日期进行加减

Java8中提供了LocalDateLocalTimeLocalDateTime分别表示日期、时间和日期时间。LocalDate的格式如2018-05-22,LocalTime的格式如15:49:50.494,那么LocalDateTime就是他们的结合体了。
直接看LocalDateTime的例子吧:

LocalDateTime dateTime = LocalDateTime.now();
// 三天之后
dateTime.plusDays(3);
// 三月之前
dateTime.minusMonths(3);
// 星期几
dateTime.getDayOfWeek();
// 月份中的第几天
dateTime.getDayOfMonth();
// 获得秒值
dateTime.getSecond();

// 获得今天的开始时间
dateTime.with(LocalTime.MIN);
// 获得今天的结束时间
dateTime.with(LocalTime.MAX);

plus系列方法用于相加,minus系列方法用于相减,get系列方法用于获得值,with系列方法用于获得处理后的副本

2.日期的格式化

原来会用到SimpleDateFormat类,但他是线程不安全的。
看新的线程安全的API:

LocalDate.parse("2005-12-03", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

3.对两个日期的判断和运算

判断两个日期:

dateTime.isAfter(other);
dateTime.isBefore(other);
dateTime.equels(other);

计算两个日期之间相差的情况:

LocalDate date = LocalDate.now();
Period period = Period.between(date, date.plusWeeks(2));
System.out.println(period.getYears() + "  " + period.getDays()); //0  14

除了Period之外,还有一个Duration也可以用于计算两个日期的差值。他们的区别是:当处理带时区的时间时,请使用Period,因为会涉及到夏令时问题

4.带时区的日期

语言对时区的支持,主要体现在UTC时间的转换上。这里需要注意一下,时区的名词有UTC和GMT,简单理解他们其实表示一个意思。
比如现在我想知道纽约现在是几点,一种方式是:

ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america);
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);

// Output :
// Current date and time in a particular timezone : 2018-05-22T16:39:47.474-05:00[America/New_York]

ZonedDateTime用于处理带时区的日期。
这里的ZoneId一定要写对,否则会抛异常。


还有另一种方式,用时区偏移量也可以实现时区时间转换:

LocalDateTime datetime = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.of("-05:00");
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
System.out.println("Date and Time with timezone offset in Java : " + date);

// Output :
// Date and Time with timezone offset in Java : 2018-05-22T16:39:47.474-05:00

这种方式对机器友好,第一种方式对人类友好。

5、与旧API的相互操作

Java8中用Instant表示时间轴上的一个点,和原先的Date很像。
下面是DateInstantLocalDateTime之间的相互转换:

         Date date = new Date();
        Instant instant = date.toInstant();
        LocalDateTime.ofInstant(instant,ZoneId.systemDefault());

        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = LocalDate.now();
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
        Date date = Date.from(zdt.toInstant());

6、时间调整之TemporalAdjusters

比如我要获取这个月的最后一天,可以这么做:

        LocalDate date = LocalDate.of(2019,1, 1);
        LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println(lastDay);

这里出现了TemporalAdjusters类,它包含的方法如下:
 

TemporalAdjusters其实是TemporalAdjuster的工具类,而TemporalAdjuster则是一个函数接口,可以执行复杂的时间操作。
比如要获取某天之后的工作日:

    public static void main(String[] args) throws UnirestException {
        LocalDate localDate = LocalDate.of(2019, 7, 8);
        TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY;
        LocalDate result = localDate.with(temporalAdjuster);
    }

    static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster(date -> {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        int daysToAdd;
        if (dayOfWeek == DayOfWeek.FRIDAY)
            daysToAdd = 3;
        else if (dayOfWeek == DayOfWeek.SATURDAY)
            daysToAdd = 2;
        else
            daysToAdd = 1;
        return date.plusDays(daysToAdd);
    });

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值