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;
}
}
在Java8之前,Java中对于日期的操作是不够那么方面的。比如对日期进行加减操作、对日期的格式化、对日期的大小进行判断等。所以会出现Joda Time工具包来帮我们解决问题。
Java8之后,就不需要再引入第三方工具包来处理日期了。
刚开始的时候,看着新的API还是非常不适应的,习惯了之后就会爱上他了。
Java8中提供了LocalDate、LocalTime和LocalDateTime分别表示日期、时间和日期时间。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系列方法用于获得处理后的副本
原来会用到SimpleDateFormat类,但他是线程不安全的。
看新的线程安全的API:
LocalDate.parse("2005-12-03", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
判断两个日期:
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());
除了Period之外,还有一个Duration也可以用于计算两个日期的差值。他们的区别是:当处理带时区的时间时,请使用Period,因为会涉及到夏令时问题
语言对时区的支持,主要体现在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);
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);
这种方式对机器友好,第一种方式对人类友好。
Java8中用Instant表示时间轴上的一个点,和原先的Date很像。
下面是Date、Instant和LocalDateTime之间的相互转换:
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());
比如我要获取这个月的最后一天,可以这么做:
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);
});
相关知识
使用按内容相等行为创建对象表达式
花生的生长周期多少天?
LeetCode习题整理(中等)I
向日葵花期多少天
python实现元旦倒计时、圣诞树、跨年烟花的绘画马上双旦了给大家带来一些python代码 1.元旦节日倒计时代码的实现
养花多少天浇一次水
建立一个植物毒性分类器:数据准备和清理
绣球花养护技巧——绣球花插花水养多少天?
洋兰切花能养多少天
室内花草多少天浇一次水
网址: Java8 Lambda表达式获取当前时间之前的多少天 https://m.huajiangbk.com/newsview144313.html
上一篇: 花卉认证的形式 |
下一篇: 秋天种植什么蔬菜容易生长 春天+ |