来源
占小狼发布的一篇博客
Date
Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。
LocalDate
- Instant 瞬时实例。
- LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
- LocalTime:本地时间,不包含日期。
- LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
- ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计。
package com.test;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* @author xxx
* @date 2020/6/5 16:43
* @desc ... copy
*/
public class T {
//DATE --> LocalDate
public static LocalDate date2LocalDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
// LocalDate --> DATE
public static Date localDate2Date(LocalDate localDate) {
if(null == localDate) {
return null;
}
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}
// localDateTime --> DATE
public static Date localDateTime2Date(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
//DATE --> String
public static String formatDate(Date date) {
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
//LocalDateTime 转 Long
localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())
//Long转 LocalDateTime
LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).toLocalDate());
//获取今天的日期
public void getCurrentDate(){
LocalDate today = LocalDate.now();
System.out.println("Today's Local date : " + today);
}
//获取年、月、日信息
public void getDetailDate(){
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d t %n", year, month, day);
}
//处理特定日期
public void handleSpecilDate(){
LocalDate dateOfBirth = LocalDate.of(2018, 01, 21);
System.out.println("The specil date is : " + dateOfBirth);
}
//获取当前时间
public void getCurrentTime(){
LocalTime time = LocalTime.now();
System.out.println("local time now : " + time);
}
// LocalTime 加减时间
public void plusHours(){
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // 增加两小时
System.out.println("Time after 2 hours : " + newTime);
LocalTime time1 = time.minusHours(2); //减少两小时
System.out.println("Time after 2 hours : " + time1);
}
//LocalDate 加减时间
public void nextWeek(){
LocalDate today = LocalDate.now();
//加一周
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
//减一个月
LocalDate nextWeek = today.minus(1, ChronoUnit.DAYS;
System.out.println("Today is : " + today);
System.out.println("Date after 1 week : " + nextWeek);
}
public void clock(){
// 根据系统时间返回当前时间并设置为UTC。
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock);
// 根据系统时钟区域返回时间
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock : " + clock);
}
//时区处理
public void getZoneTime(){
//设置时区
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
System.out.println("现在的日期和时间在特定的时区 : " + dateAndTimeInNewYork);
}
//检查闰年
public void isLeapYear(){
LocalDate today = LocalDate.now();
if(today.isLeapYear()){
System.out.println("This year is Leap year");
}else {
System.out.println("2018 is not a Leap year");
}
}
//计算两个日期之间的天数和月数
public void calcDateDays(){
LocalDate today = LocalDate.now();
LocalDate java8Release = LocalDate.of(2018, Month.MAY, 14);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("Months left between today and Java 8 release : "
+ periodToNextJavaRelease.getMonths() );
}
// 包含时差信息的日期和时间
public void ZoneOffset(){
LocalDateTime datetime = LocalDateTime.of(2018, Month.FEBRUARY, 14, 19, 30);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
System.out.println("Date and Time with timezone offset in Java : " + date);
}
// 获取时间戳
public void getTimestamp(){
Instant timestamp = Instant.now();
System.out.println("What is value of this instant " + timestamp);
}
// 使用预定义的格式化工具去解析或格式化日期
public void formateDate(){
String dayAfterTommorrow = "20180210";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
}
}
获取当月第一天
LocalDate first= LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
获取当月最后一天
LocalDate with = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
获取某天0点0分0秒 ->Long(LocalDate,LocalDateTime)
//Long
LocalDate date1 = LocalDate.now();
long s= date1.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()
//LocalDate
LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toLocalDate();
//LocalDateTime
LocalDateTime qws = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
获取某天23点59分59秒 ->Long(LocalDate,LocalDateTime)
LocalDateTime dsdf = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
String yyyy-MM 转 LocalDate
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM");
YearMonth ym = YearMonth.parse("2020-09", fmt);
LocalDate date = ym.atEndOfMonth();//月末
LocalDate date1 = ym.atDay(0);//月初
LocalDate 转 String yyyy-MM
DateTimeFormatter DATE_DTF = DateTimeFormatter.ofPattern("yyyy-MM");
String statisticDate = LocalDate.now().format(DATE_DTF);