java 8 常用日期转换记录

157 阅读2分钟
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;
    }
    ```

}