利用LocalDate獲取每月幾號,每週幾
阿新 • • 發佈:2019-01-01
jdk8為我們提供了非常好用的時間日期工具類。
我們可以使用LocalDate 、LocalTime 、LocalDateTime來表示日期和時間,並且和資料庫的欄位可直接轉換,
涉及到時區可使用ZonedDateTime,時區是用ZoneId類表示。實際上可以使用以上幾個滿足開發中的所有需求
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> getLocalDateListByweek(LocalDate startDate,LocalDate endDate,List<String> weeks){
List<LocalDate> localDateList = new ArrayList<>();
TemporalField temporalField = WeekFields.of(DayOfWeek.of(1), 1).dayOfWeek();
LocalDate localDate;
for(String week : weeks){
localDate = startDate.with(temporalField, Integer.valueOf(week));
if(localDate.isBefore(startDate)){
localDate = localDate.plusWeeks(1);
}
while (localDate.isBefore(endDate)){
localDateList.add(localDate);
localDate = localDate.plusWeeks(1);
if(localDate.isEqual(endDate)){
localDateList.add(localDate);
}
}
}
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;
LocalDate tempDate = startDate;
for(String month : months){
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());
}