JSR 310: Date and Time API Example

JSR 310: Date and Time API เป็น api ที่เกี่ยวกับ วันและเวลา ซึ่งได้ Stephen Colebourne founded และ leads ของ Joda-Time project Michael Nascimento Santos founded และ leads ของ Genesis project และ Roger Riggs ซึ่งเป็นทึมงานของ Oracle มาเป็น Specification Leads โดยในขณะที่ผมเขียนบทความนี้ JSR 310 อยู่ในสถานะ Active ใน JCP ver. 2.9

JSR 310 นั้นเป็น API ที่มีความใกล้เคียงกับ Joda-Time มาก(ก็ได้ project founder มาเป็น spec leads นี่หน่า) โดย package ของ JSR 310 จะอยู่ใน javax.time เสียส่วนมาก สำหรับคนที่ใช้งาน Joda-time อยู่เป็นนิจอยู่แล้วคงไม่ต้องอะไรมากกับ api ตัวนี้ครับ เพราะต่างกันน้อยมาก เท่าที่เห็นก็น่าจะเป็นพวก enum และ builder pattern ที่ถูกใส่เข้ามาให้ใช้งานง่ายขึ้น

ตัวอย่างแรกที่จะทำเสนอคือ การสร้าง Date

//JSR 310
import javax.time.calendar.LocalDate;
import javax.time.calendar.MonthOfYear;

public class DateTimeExample {
	public static void main(String[] args) {
		LocalDate localDate = LocalDate.of(2012, MonthOfYear.DECEMBER, 11);
		localDate = localDate.plusDays(5);
		System.out.println(localDate.toString());
	}
}
//JODA-TIME
import org.joda.time.LocalDate;

public class DateTimeExample {
	public static void main(String[] args) {
		LocalDate localDate = new LocalDate(2012, 12, 11);
		localDate = localDate.plusDays(5);
		System.out.println(localDate.toString());
	}
}

จากโค๊ดตัวอย่างด้านบนจะเห็นว่า JSR 310 นั้นใช้ static factory method ในการสร้าง LocalDate ส่วน Joda-time นั้นใช้การสร้าง LocalDate ขึ้นมาใหม่เลยซึ่ง LocalDate ของ Joda-time นั้นเป็น immutable class ซึ่งคลาสอื่นของทั้งสอง implement จะใช้งานเหมือนตัวอย่างข้างบน ซึ่งผมจะขอข้ามไปเลยครับ (คลาสอื่นๆได้แก่ DateTime, DateMidnight, LocalTime, LocalDateTime ซึ่งคลาสทั้งหมดนี้ของ Joda-time เป็น immutable class ทั้งหมด)

ตัวอย่างต่อไปจะเป็นการทำ condition ของ DateTime ใน JSR 310

import javax.time.calendar.LocalDate;
import javax.time.calendar.MonthOfYear;

public class DateTimeExample {
	public static void main(String[] args) {
		LocalDate localDate = LocalDate.of(2012, MonthOfYear.DECEMBER, 11);
		MonthOfYear monthOfYear = localDate.getMonthOfYear();
		if (monthOfYear.isDecember()) {
			System.out.println("now is december.");
		}
	}
}

ระบบตรวจสอบวันที่ใน JSR 310

import javax.time.calendar.DateResolvers;
import javax.time.calendar.LocalDate;
import javax.time.calendar.MonthOfYear;

public class DateTimeExample {
	public static void main(String[] args) {
		LocalDate localDate = LocalDate.of(2012, MonthOfYear.JANUARY, 31);
		LocalDate noResolver = localDate.plusMonths(1); //ถ้าเดือนต่อไปเกินจะเป็นวันสุดท้ายของเดือนต่อไป
		LocalDate nextValid = localDate.plusMonths(1, DateResolvers.nextValid()); //ถ้าเดือนสุดท้ายเกินจะเป็นวันแรกของอีกเดือนถัดไป
		LocalDate partLenient = localDate.plusMonths(1, DateResolvers.partLenient()); //ถ้าเดือนสุดท้ายเกินจะเพิ่มวันที่ขาดไปให้ของอีกเดือนถัดไป
		LocalDate previousValid = localDate.plusMonths(1, DateResolvers.previousValid()); //เป็นค่า default 
		LocalDate strict = localDate.plusMonths(1, DateResolvers.strict()); //ถ้าเดือนต่อไปเกิน จะ throw exception InvalidCalendarFieldException
		System.out.println(noResolver.toString()); //2012-02-29
		System.out.println(nextValid.toString()); //2012-03-01
		System.out.println(partLenient.toString()); //2012-03-02
		System.out.println(previousValid.toString()); //2012-02-29
		System.out.println(strict.toString()); // throw exception
	}
}

การ Adjustment ใน JSR 310 โดยใช้ DateAdjusters

import javax.time.calendar.DateAdjusters;
import javax.time.calendar.DayOfWeek;
import javax.time.calendar.LocalDate;
import javax.time.calendar.MonthOfYear;

public class DateTimeExample {
	public static void main(String[] args) {
		LocalDate localDate = LocalDate.of(2012, MonthOfYear.DECEMBER, 11);
		LocalDate endOfMonth = localDate.with(DateAdjusters.lastDayOfMonth()); // หาวันสุดท้ายของเดือนใน localDate
		System.out.println(endOfMonth.toString());
		LocalDate dayOfWeek = localDate.with(DateAdjusters.next(DayOfWeek.MONDAY)); // หาวันจันทร์ถัดไป
		System.out.println(dayOfWeek.toString());
	}
}

การใช้ Builder Pattern

import javax.time.calendar.MonthOfYear;
import javax.time.calendar.OffsetDateTime;
import javax.time.calendar.Year;
import javax.time.calendar.ZoneOffset;

public class DateTimeExample {
	public static void main(String[] args) {
		// builder pattern
		OffsetDateTime dt = Year.of(2010).atMonth(MonthOfYear.FEBRUARY).atDay(26).atTime(12, 30).atOffset(ZoneOffset.of("+03:00"));
		// normal shorthand
		OffsetDateTime odt = OffsetDateTime.of(2010, 2, 26, 12, 30, ZoneOffset.of("+03:00"));
	}
}

ตัวอย่างที่ได้นำเสนอไปนั้นเป็นแค่ความสามารถทั่วไปของ api ตัวนี้หาสนใจเพิ่มเติมสามารถดูได้จาก JSR 310 api



me on google plus+Jirawong Wongdokpuang

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s