package cn.nice.flow.test;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
/**
* @Description localDate : 主要用于处理日期的 java8 特性之一
* @Author nice
* @Date 2021/9/22 4:33 下午
*/
public class LocalDateDemo {
@Test
public void test1(){
LocalDate localDate = LocalDate.now(); // 2021-09-22
// System.out.println(localDate.toString()); // 2021-09-22
LocalDateTime localDateTime = LocalDateTime.now();
// System.out.println(localDateTime); // 2021-09-22T16:54:34.869
// System.out.println(localDateTime.toLocalTime()); // 16:55:48.355
System.out.println(localDateTime.toString()); // 2021-09-22T17:31:45.509
LocalDate localDate1 = LocalDate.of(2020,12,3);
// System.out.println(localDate1); // 2020-12-03
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
// System.out.println(dayOfWeek.getValue()); // 获取星期: 3
// System.out.println(localDate.getMonth().getValue()); // 获取月份: 9
Boolean isLeapYear = localDate.isLeapYear(); // 获取当前日期所在年是否是闰年
/**
* with开头的方法,我的理解是将参数替换localDate中的对应
* 属性,重新计算得到新的日期。
* 将参数中的"日"替换localDate中的"日"
* 将参数中的天数替换localDate中的天数
* 将参数中的"月"替换localDate中的"月"
* 将参数中的"年"替换localDate中的"年"
* */
localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.withDayOfMonth(2)); // 2019-01-02
System.out.println(localDate.withDayOfYear(40)); // 2019-02-09
System.out.println(localDate.withMonth(2)); // 2019-02-07
System.out.println(localDate.withYear(2020)); // 2020-01-07
Period weeks = Period.ofWeeks(2);
Period years = Period.ofYears(2);
System.out.println(localDate.minus(weeks)); // 2019-01-07 - > 2018-12-24 (2周前)
System.out.println(localDate.plus(weeks)); // 2019-01-07 - > 2019-01-21(2周后)
/**
* localDate.minusDays(long days)
* localDate.minusWeeks(long weeks)
* localDate.minusMonths(long months)
* localDate.minusYears(long years)
* localDate.plusDays(long days)
* localDate.plusWeeks(long weeks)
* localDate.plusMonths(long months)
* localDate.plusYears(long years)
* */
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(LocalTime.now().atDate(LocalDate.now()).format(formatter)); // 2021-09-22 17:40:30
System.out.println(LocalDate.now().atTime(LocalTime.now()).format(formatter)); // 2021-09-22 17:40:30
String s = localDateTime.format(formatter); // 2021-09-22 17:40:30
System.out.println(s);
}
/** 使用转换日期判定日期是否符合正确日期,目前没找到好用的 */
public static boolean isValidDate(String str) {
boolean convertSuccess=true;
// 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");
try {
// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
format.setLenient(false);
format.parse(str);
} catch (ParseException e) {
// e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
convertSuccess=false;
}
return convertSuccess;
}
```
/**
* STRICT:严格模式,日期、时间必须完全正确。
* SMART:智能模式,针对日可以自动调整。月的范围在 1 到 12,日的范围在 1 到 31。比如输入是 2 月 30 号,当年 2 月只有 28 天,返回的日期就是 2 月 28 日。
* LENIENT:宽松模式,主要针对月和日,会自动后延。
* */
public boolean isValid(String dateStr) {
private static final String dateTimeFormatter = "YYYY-MM-dd HH:mm:ss";
DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(dateTimeFormatter, Locale.CHINA);
DateTimeFormatter dateFormatter = DATE_FORMATTER.withResolverStyle(ResolverStyle.STRICT);
try {
dateFormatter.parse(dateStr);
} catch (DateTimeParseException e) {
return false;
}
return true;
}
```
}