一、簡介
Date:java.util.Date包,包含日期,時間,毫秒數。
Calendar:java.util.Calendar包,abstract修飾,Date的很多方法已經過時遷移到了Calendar類上。
LocalDate/LocalDateTime:java.time.LocalDate/java.time.LocalDateTime包,這個類是不可變的和線程安全的。使用equals
方法比較 。
二、java.util.Date
Date的setXXX()和getXXX()獲取Date,Day,Year,Hours,TimezoneOffSet等等之類的方法都已經被棄用了。
三、java.util.Calendar
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>
所述Calendar
類是一個抽象類,可以為在某一特定時刻和一組之間的轉換的方法calendar fields如YEAR
, MONTH
, DAY_OF_MONTH
, HOUR
,等等,以及用於操縱該日歷字段,如獲取的日期下個星期。 時間上的瞬間可以用毫秒值表示,該值是從1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量。該類還提供了用於在包外部實現具體日歷系統的其他字段和方法。
Calendar c=Calendar.getInstance(); c.add(Calendar.DATE,-1);//減一天 StringBuffer bf=new StringBuffer(); bf.append(c.get(Calendar.YEAR)+"年"); bf.append(c.get(Calendar.MONTH)+1+"月"); bf.append(c.get(Calendar.DATE)+"日"); bf.append(c.get(Calendar.HOUR_OF_DAY)+"時");//24小時制 //bf.append(c.get(Calendar.HOUR)+"時");//12小時制 bf.append(c.get(Calendar.MINUTE)+"分"); bf.append(c.get(Calendar.SECOND)+"秒"); bf.append("本年第"+c.get(Calendar.DAY_OF_YEAR)+"天;"); bf.append("本月第"+c.get(Calendar.DAY_OF_WEEK_IN_MONTH)+"周;"); bf.append("本周第"+c.get(Calendar.DAY_OF_WEEK)+"天;"); bf.append(c.get(Calendar.WEEK_OF_MONTH)+";今年第"+c.get(Calendar.WEEK_OF_YEAR)+"周");
四、java.time.LocalDate/java.time.LocalDateTime
public final class extends Object implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable
LocalDate/LocalDateTime是一個不可變的日期時間對象,表示日期,通常被視為年月日。 也可以訪問其他日期字段,例如日期,星期幾和星期。 例如,值“2007年10月2日”可存儲在LocalDate
。該類不存儲或表示時間或時區。 相反,它是日期的描述,用於生日。 它不能代表時間線上的即時信息,而沒有附加信息,如偏移或時區。ISO-8601日歷系統是當今世界絕大多數的現代民用日歷系統。 它相當於今天的閏年規則一直適用於日常生活的公歷日歷系統。 對於今天寫的大多數應用,ISO-8601規則是完全合適的。 然而,任何利用歷史日期並要求它們准確的應用程序都將發現ISO-8601方法不合適。
/** *獲取當前時間,指定特定時間。進行時間的加減 */ LocalDateTime ldt = LocalDateTime.now();LocalDate.now(); LocalTime.now();
ldt.plusHours(8L);
ldt.plusSeconds(10L); ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDateTime ldt2 = ldt.minus(5,ChronoUnit.MONTHS); ldt2.atZone(ZoneId.systemDefault()); ldt2 = ldt2.withHour(2); ldt2 = ldt2.withYear(2015); ldt2 = ldt2.with(ChronoField.MONTH_OF_YEAR,3);
/**
*間隔計算 *使用Duration進行 day,hour,minute,second等的計算 *使用Period進行Year,Month的計算 */ Duration duration = Duration.between(ldt,ldt2); duration.toDays(); duration.toHours(); duration.toMinutes(); Period period = Period.between(ldt.toLocalDate(),ldt2.toLocalDate()); period.getYears(); period.getMonths(); period.toTotalMonths();
/**
*與Date的轉化,format為String
*/ Date date = Date.from(ldt2.atZone(ZoneId.systemDefault()).toInstant()); LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()); ldt3.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
/**
*根據需求需要取得當天的零點 */ LocalDateTime today_start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);//當天零點 String td_st_str =today_start.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));//獲取當天結束時間 LocalDateTime today_end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);//當天零點 /**
*LocalDateTime與String日期互相轉換
*/ DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime time = LocalDateTime.now(); String localTime = df.format(time); LocalDateTime ldt = LocalDateTime.parse("2016-08-08 18:08:08",df); System.out.println("LocalDateTime轉成String類型的時間:"+localTime); System.out.println("String類型的時間轉成LocalDateTime:"+ldt); /** *通過localdatetime獲取long型毫秒時間,注意時區,東八區
*/ Long newSecond1 = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();