Date 和 Calendar是能夠變化的類,非線程安全的java
第三方的時間庫 Joda-Timeexpress
java.time LocalDate,LocalTime,LocalDateTime,Instant,Duration,Period安全
LocalDate是不可變的類,沒有具體一天的時間,不帶時區的信息ide
creating a LocalDate and reading its vaules,creating a LocalTime and reading its valuesspa
@Test.net
public void testLocalDate() {線程
LocalDate date = LocalDate.of(2014, 3, 18);three
int year = date.getYear();ip
Month month = date.getMonth();get
int day = -date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek();
int len = date.lengthOfMonth();
boolean leap = date.isLeapYear();
Object[] params = {date, year, month, day, dow, len, leap};
System.out.println("is:" + JSONObject.toJSONString(params));
//the current date from the system clock
LocalDate today = LocalDate.now();
//get values using a TemporalField
int year1 = date.get(ChronoField.YEAR);
int month1 = date.get(ChronoField.MONTH_OF_YEAR);
int day1 = date.get(ChronoField.DAY_OF_MONTH);
}
public void testLocalTime() {
//13:45:20
LocalTime time = LocalTime.of(13, 45, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
}
public void testParseString() {
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");
}
creating a LocalDateTime directly or by combining a date and a time
public void testLocalDateTime() {
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
LocalDateTime dt2 = LocalDateTime.of(date, time);
//combine date and time
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
//from localdatetime to localdate or localtime
LocalDate date1 = dt1.toLocalDate();
LocalTime time1 = dt1.toLocalTime();
}
public void testDuration() {
//duration is used to represent an amount if time mesured in seconds and eventually nanoseconds
//cant pass a LocalDate to the between method.
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime dateTime1 = LocalDateTime.now();
LocalTime time1 = dateTime.toLocalTime();
LocalTime time2 = dateTime1.toLocalTime();
Duration duration = Duration.between(time1, time2);
Duration duration1 = Duration.between(dateTime, dateTime1);
}
@Test
public void testPeriod() {
//period
Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));
}
@Test
public void testCreateFromFactory() {
//duration or period
Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes1 = Duration.of(3, ChronoUnit.MINUTES);
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
}
in a absolute way
@Test
public void testAttributesManipulating() {
LocalDate date1 = LocalDate.of(2014, 3, 18);
LocalDate date2 = date1.withYear(2011);// 2011-03-18
LocalDate date3 = date2.withDayOfMonth(25);//2011-03-25
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);//2011-09-25
}
in a relative way
@Test
public void testAttributesManipulating2(){
LocalDate date1=LocalDate.of(2014,3,18);//2014-03-18
LocalDate date2=date1.plusWeeks(1);
LocalDate date3=date2.minusYears(3);
LocalDate date4=date3.plus(6,ChronoUnit.MONTHS);
}
using the prediefined TemporalAdjusters
@Test
public void testUseTemporalAdjusters(){
LocalDate date1=LocalDate.of(2014,3,18);
LocalDate date2=date1.with(nextOrSame(DayOfWeek.SUNDAY));
//2014-03-31
LocalDate date3=date2.with(lastDayOfMonth());
}
建立本身的adjusters implements TemporlAdjuster
/**
*若是要一些特殊的日期計算能夠定義本身的計算方法類
* use TemporalAdjuster interface
*/
public class NextWorkingDay implements TemporalAdjuster{
@Override
public Temporal adjustInto(Temporal temporal) {
DayOfWeek dow=DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd=1;
if(dow==DayOfWeek.FRIDAY) {
dayToAdd=3;
}else if(dow==DayOfWeek.SATURDAY) {
dayToAdd=2;
}
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
}
/**
*1 使用上面的類
*/
@Test
public void test() {
LocalDate date = LocalDate.now();
date.with(new NextWorkingDay());
}
/**
*2 using a lambda expression
*/
@Test
public void test1() {
LocalDate date = LocalDate.now();
date.with(temporal -> {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if (dow == DayOfWeek.FRIDAY) {
dayToAdd = 3;
} else if (dow == DayOfWeek.SATURDAY) {
dayToAdd = 2;
}
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});
}
/**
*3 using the TemporalAdjusters.ofdateAdjuster
*/
@Test
public void test2() {
TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(temporal -> {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if (dow == DayOfWeek.FRIDAY) {
dayToAdd = 3;
}
if (dow == DayOfWeek.SATURDAY) {
dayToAdd = 2;
}
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});
LocalDate date=LocalDate.now();
date=date.with(nextWorkingDay);
System.out.println("date:"+date.toString());
}