利用LocalDate獲取每月幾號,每周幾


       jdk8為我們提供了非常好用的時間日期工具類。我們可以使用LocalDate 、LocalTime 、LocalDateTime來表示日期和時間,擁有極為方便的API滿足業務需求,並且和數據庫的字段可直接對應。這幾個可以滿足開發中的所有需求,極力推薦使用,請徹底放棄那些難用的Date 、Calendar、TimeStamp吧!

Java8中的時間核心功能如下:

描述
Instant 表示時間線上的某一時刻。通常是表達為“1970年初到這個時間點一共經過了多少納秒
Duration 表達一段時間,可以說Duration是兩個Instant之間的時間差,也可以說Instant是1970年初到這個時間點的Duration
LocalDate 用於表示一個無時區的日期,比如生日、節日等等。
LocalDateTime 同上,無時區的日期與時間
LocalTime 同上,無時區的時間
ZonedDateTime 表示一個包含時區的日期與時間(如北京時間2017.04.02 8:00)
Period
DateTimeFormatter 負責將時間轉為字符串,內置了許多常用的格式。替換了之前的simpleDateFormatter

Java 7中包含下表中列出的類與方法:(這里僅作為一個回顧,推薦使用上面介紹的java8中新的日期類)

描述
System.currentTimeMillis() 一個靜態方法,返回當前日期時間(從1970年初到當前時間,經過了多少毫秒)
java.util.Date 用於表示日期和時間的類,大多數里頭的方法已經不推薦使用了(deprecated).
java.sql.Date 用於表示日期的類,所有時間信息全被砍掉了,一般在數據庫連接時使用
java.sql.Timestamp 同上,只是保留了時間信息。
java.util.Calendar 一個Calendar的基本類,可以對日期和時間進行操作,如加一天、一月、一年等等。
java.util.TimeZone 用於表達時區的類,當跨時區進行Calendar操作時很有用。
SimpleDateFormat 幫助把字符串解析為Date的類,同時也可將Date格式化為字符串。

在時間與字符串轉換時經常會用到的表示:

y   = 年份 (yy or yyyy)
M   = 月份 (MM)
d   = 一個月中的第幾天      (dd)
h   = 小時 (0-12)  (hh)
H   = 小時 (0-23)  (HH)
m   = 一小時中的第幾分鍾 (mm)
s   = 秒   (ss)
S   = 毫秒 (SSS)
z   = 時區 (比如:Pacific Standard Time)
Z   = 時區的時差 (比如:-0800)


yyyy-MM-dd           (2009-12-31)
dd-MM-YYYY           (31-12-2009)    
yyyy-MM-dd HH:mm:ss  (2009-12-31 23:59:59)
HH:mm:ss.SSS         (23:59.59.999)
yyyy-MM-dd HH:mm:ss.SSS   (2009-12-31 23:59:59.999)
yyyy-MM-dd HH:mm:ss.SSS Z   (2009-12-31 23:59:59.999 +0100)

1. 下面的工具類即利用LocalDate來獲取指定范圍內的日期,每周四,每月31號(沒有則略過)


import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/** * @author 94977 * @create 2018/12/8 */
public class DateUtil {


    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";


    public static LocalDate getLocalDateByStr(String str){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_YYYY_MM_DD);
       return LocalDate.parse(str, formatter);
    }

    /** * 獲取指定日期范圍內的所有指定星期 包含開始日期和結束日期 * @param weeks 1,3,7表示周一,周三,周日 * @return List<LocalDate> */
   public static List<LocalDate> getWeekLocalDateListByRange(LocalDate startDay, LocalDate endDay, List<String> weeks) {
        List<LocalDate> localDateList = new ArrayList<>();
        TemporalField fieldISO = WeekFields.of(DayOfWeek.of(1), 1).dayOfWeek();
        LocalDate tempDay;
        for (String week : weeks) {
            tempDay = startDay.with(fieldISO, Long.parseLong(week));
            if (tempDay.isBefore(startDay)) {
                tempDay = tempDay.plusWeeks(1);
            }
            while (tempDay.isBefore(endDay) || tempDay.isEqual(endDay)) {
                localDateList.add(tempDay);
                tempDay = tempDay.plusWeeks(1);
            }
        }
        return localDateList;
    }

    /** * 獲取指定日期范圍內的所有指定dayOfMonth 包含開始日期和結束日期 * @param months 1,29,31表示每月的1號,29號,31號 * @return List<LocalDate> */
    public static List<LocalDate> getLocalDateListByMonth(LocalDate startDate,LocalDate endDate,List<String> months){
        List<LocalDate> localDateList = new ArrayList<>();

        LocalDate localDate; 
        for(String month : months){
       		 LocalDate tempDate = startDate;
            while (tempDate.isBefore(endDate) || tempDate.getMonthValue() == endDate.getMonthValue()){
                if(tempDate.lengthOfMonth() >= Integer.valueOf(month)){
                    localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                    if(localDate.isAfter(startDate) || localDate.isEqual(startDate)){
                        localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                        if(localDate.isEqual(endDate) || localDate.isBefore(endDate)){
                            localDateList.add(localDate);
                        }
                    }
                }
                tempDate = tempDate.plusMonths(1);
            }
        }
        return localDateList;
    }

    /** * 獲取指定范圍內所有日期,包含開始日期和結束日期 * @return List<LocalDate> */
    public static List<LocalDate> getLocalDateByDay(LocalDate startDate,LocalDate endDate){
        List<LocalDate> localDateList = Stream.iterate(startDate, date -> date.plusDays(1)).
                limit(ChronoUnit.DAYS.between(startDate, endDate))
                .collect(Collectors.toList());
        localDateList.add(endDate);
        return localDateList;
    }

    public static void main(String[] args) {
        LocalDate startDate = getLocalDateByStr("2018-10-27");
        LocalDate endDate = getLocalDateByStr("2018-11-05");
        System.out.println(getLocalDateByDay(startDate,endDate));
        List<String> strings = new ArrayList<>();
        strings.add("31");
        List<LocalDate> localDateListByweek = getLocalDateListByMonth(startDate, endDate, strings);
        System.out.println(localDateListByweek);
    }

}

2. 獲取當天最晚和最早的時間

	public static final String DATE_FORMAT_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

    /** * 轉為ISO8601標准時間 2018-12-12T14:03:27.505+0800,使用默認時區 * @param localDateTime localDateTime */
    public static String getStandardTime(LocalDateTime localDateTime){
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern(DATE_FORMAT_ISO_8601);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        return pattern.format(zonedDateTime);
    }

    /** * 返回當天最晚的時間2018-12-16T23:59:59.000+0800,使用默認時區 * @param localDate localDate */
    public static String getEndTime(LocalDate localDate){
        return getStandardTime(localDate.plusDays(1).atStartOfDay().minusSeconds(1));
    }

    /** * 返回當天最早的時間2018-12-16T00:00:00.000+0800,使用默認時區 * @param localDate localDate */
    public static String getStartTime(LocalDate localDate){
        return getStandardTime(localDate.atStartOfDay());
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM