.. .Lập trình Java – IT4784 Phần I Giới thiệu Interoperating with Legacy Code • Như sáng tạo hoàn toàn mới, ngày thời gian API Java phải tương thích với lớp có, chẳng hạn java. util.Date, java. util.GregorianCalender,... (Instant) NGUYỄN ĐỨC HẬU - 20124977 Lập trình Java – IT4784 • Tương tự vậy, ZonedDateTime tương tự java. util.GregorianCalendar, lớp có phương th ức chuyển đổi Java Phương thức chuyển đổi toZonedDateTime... 15:45:50 ICT 2014 NGUYỄN ĐỨC HẬU - 20124977 Lập trình Java – IT4784 Phần II Câu hỏi trắc nghiệm 1) Câu 1:Phương thức dùng để chuyển đổi lớp java. util.Date java. time.Instant? A Date.from(instant)
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ---------------------------- BÁO CÁO MÔN HỌC LẬP TRÌNH JAVA – IT4784 5.7 Interoperating with Legacy Code Sinh viên: Nguyễn Đức Hậu MSSV: 20124977 Lớp: CNTT1.02 – K57 GV hướng dẫn: TS. Nguyễn Hồng Quang Hà Nội, ngày 20 tháng 9 năm 2015 Lập trình Java – IT4784 Phần I. Giới thiệu về Interoperating with Legacy Code • Như một sáng tạo hoàn toàn mới, ngày và thời gian API trong Java sẽ phải tương thích với các lớp hiện có, chẳng hạn như java.util.Date, java.util.GregorianCalender, và java.sql.Date/Time/Timestamp. • Lớp Thời gian hiện tại(Instant) là gần tương tự như lớp java.util.Date. Trong Java 8, lớp này có hai phương thức bổ sung: phương thức toInstant có thể chuyển đổi một ngày(Date) sang thời gian hiện tại(Instant), và giữ nguyên phương thức có thể chuyển đổi theo hướng khác. Ví dụ :Instant & Date Date date = Date.from(instant); // API -> legacy Instant instant = date.toInstant(); // legacy -> new API Date.from (Instant) : tạo ra một đối tượng ngày(Date) từ một thời gian hiện tại(Instant). Date.toInstant() : chuyển đổi một đối tượng ngày(Date) sang một thời gian hiện tại (Instant). NGUYỄN ĐỨC HẬU - 20124977 2 Lập trình Java – IT4784 • Tương tự như vậy, ZonedDateTime cũng tương tự java.util.GregorianCalendar, và lớp này cũng có các phương th ức có thể chuyển đổi trong Java 8. Phương thức chuyển đổi toZonedDateTime từ GregorianCalendar sang ZonedDateTime, và có thể chuyển đổi ngược lại Ví dụ: ZonedDateTime & GregorianCalendar GregorianCalendar gc = GregorianCalendar.from(zdt) ; ZonedDateTime zdt = cal.toZonedDateTime(); GregorianCalendar.from (ZonedDateTime) : tạo ra một đối tượng GregorianCalendar bằng cách sử dụng ngôn ngữ mặc định từ một ZonedDateTime. cal.toZonedDateTime () : chuyển đổi một GregorianCalendar sang một ZonedDateTime. • Một bộ chuyển đổi có sẵn cho các lớp ngày và thời gian trong gói java.sql. Bạn cũng có thể sử dụng một DateTimeFormatter t ừ mã kế thừa để sử dụng java.text.Format. Ví dụ Date today = new Date(); System.out.println("Today is : " + today); //formatting date in Java using SimpleDateFormat SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy"); String date = DATE_FORMAT.format(today); System.out.println("Today in dd-MM-yyyy format : " + date); NGUYỄN ĐỨC HẬU - 20124977 3 Lập trình Java – IT4784 • Bảng chuyển đổi giữa các lớp java.time và lớp kế thừa Lớp Date & Instant ZonedDatetime & GregorianCalendar Các phương thức chuyển đổi + Date.from(instant): tạo ra một đối tượng ngày(Date) từ một thời gian hiện tại(Instant). + date.toInstant(): chuyển đổi một đối tượng ngày(Date) sang một thời gian hiện tại (Instant). + GregorianCalendar.from (zonedDateTime) : tạo ra một đối tượng GregorianCalendar từ một ZonedDateTime. + cal.toZonedDateTime () : chuyển đổi một GregorianCalendar sang một ZonedDateTime. + TimeStamp.from(instant) : tạo ra một đối tượng Instant & nhãn thời gian(TimeStamp) từ thời gian hiện TimeStamp tại(Instant). + timestamp.toInstant() : chuyển đổi từ một nhãn thời gian(TimeStamp) sang thời gian hiện tại(Instant). +Timestamp.valueOf(localDateTime) :tạo ra LocalDateTime & java.sql.TimeStamp từ LocalDateTime. TimeStamp + timestamp.toLocalDateTime() : chuyển đổi từ TimeStamp sang LocalDateTime + Date.valueOf(localDate) : tạo java.sql.Date từ LocalDate & Date LocalDate + date.toLocalDate() : chuyển đổi từ Date sang LocalDate + Time.valueOf(localTime) : tạo java.sql.Time từ LocalTime & Time LocalTime + time.toLocalTime() : chuyển đổi từ Time sang LocalTime + Formatter.toFormat() : chuyển đổi từ DateTimeFormatte DateTimeFormatter sang DateFormat r & DateFormat TimeZone & ZoneId +TimeZone.getTimeZone(id) : tạo TimeZone từ ZoneId + timeZone.toZoneId() :chuyển đổi một đối tượng TimeZone sang một đối tượng ZoneId NGUYỄN ĐỨC HẬU - 20124977 4 Lập trình Java – IT4784 FileTime & Instant • + FileTime.from(instant) : tạo FileTime từ Instant + fileTime.toInstant() : chuyển đổi từ FileTime sang Instant Một số ví dụ về chuyển đổi Ví dụ: Instant & TimeStamp TimeStamp timeStamp = TimeStamp.from(instant); // API -> legacy Instant instant = time.toInstant(); // legacy -> new API Ví dụ : LocalDate & Date Date date = Date.valueOf(localDate); // API -> legacy LocalDate localDate = date.toLocalDate(); // legacy -> new API Ví dụ : LocalDateTime & TimeStamp TimeStamp timeStamp = TimeStamp.valueOf(ldt); LocalDateTime ldt = timeStamp.toLocalDateTime(); Ví dụ : LocalTime & Time Time time = Time.valueOf(localTime); // API -> legacy LocalTime localTime = time.toLocalTime(); // legacy -> new API Ví dụ : TimeZone & ZoneId TimeZone timeZone = TimeZone.getTimeZone(zoneId); ZoneId zoneId = timeZoned.toZoneId(); Ví dụ : FileTime & Instant FileTime fileTime = FileTime.from(instant); Instant instant = fileTime.toInstant(); NGUYỄN ĐỨC HẬU - 20124977 5 Lập trình Java – IT4784 • Một số ví dụ cụ thể Ví dụ 1:chuyển đổi giữa Date & Instant public class Main { public static void main(String[] args) { Date dt = new Date(); System.out.println("Date: " + dt); Instant in = dt.toInstant(); System.out.println("Instant: " + in); Date dt2 = Date.from(in); System.out.println("Date: " + dt2); } } Kết quả Date: Mon Sep 21 20:09:49 ICT 2015 Instant: 2015-09-21T13:09:49.937Z Date: Mon Sep 21 20:09:49 ICT 2015 NGUYỄN ĐỨC HẬU - 20124977 6 Lập trình Java – IT4784 Ví dụ 2: public class Main { public static void main(String[] args) { GregorianCalendar gc = new GregorianCalendar(2014, 2, 11, 15, 45, 50); LocalDate ld = gc.toZonedDateTime().toLocalDate(); System.out.println("Local Date: " + ld); LocalTime lt = gc.toZonedDateTime().toLocalTime(); System.out.println("Local Time: " + lt); LocalDateTime ldt = gc.toZonedDateTime().toLocalDateTime(); System.out.println("Local DateTime: " + ldt); OffsetDateTime od = gc.toZonedDateTime().toOffsetDateTime(); System.out.println("Offset Date: " + od); OffsetTime ot = gc.toZonedDateTime().toOffsetDateTime().toOffsetTime(); System.out.println("Offset Time: " + ot); ZonedDateTime zdt = gc.toZonedDateTime(); System.out.println("Zoned DateTime: " + zdt); ZoneId zoneId = zdt.getZone(); TimeZone timeZone = TimeZone.getTimeZone(zoneId); System.out.println("Zone ID: " + zoneId); System.out.println("Time Zone ID: " + timeZone.getID()); GregorianCalendar gc2 = GregorianCalendar.from(zdt); System.out.println("Gregorian Calendar: " + gc2.getTime()); } } Kết quả : Local Date: 2014-03-11 Local Time: 15:45:50 Local DateTime: 2014-03-11T15:45:50 Offset Date: 2014-03-11T15:45:50+07:00 Offset Time: 15:45:50+07:00 Zoned DateTime: 2014-03-11T15:45:50+07:00[Asia/Bangkok] Zone ID: Asia/Bangkok Time Zone ID: Asia/Bangkok Gregorian Calendar: Tue Mar 11 15:45:50 ICT 2014 NGUYỄN ĐỨC HẬU - 20124977 7 Lập trình Java – IT4784 Phần II. Câu hỏi trắc nghiệm 1) Câu 1:Phương thức nào dùng để chuyển đổi giữa 2 lớp java.util.Date và java.time.Instant? A. Date.from(instant) B. Instant.toDate(); C. date.getInstant(); D. date.toLocalTime(); Đáp án A 2) Câu 2: Kết quả đoạn code sau là : DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm:ss"); System.out.println(dateTime.format(f)); A. Jan 20, 2020 , 11:12:34 B. January 20, 2020, 11:12:34 C. January 20, 20, 11:12:34 D. Jan 20, 20, 11:12:34 Đáp án B 3) Câu 3: Phương thức nào dùng để chuyển đổi giữa 2 lớp java.util.GregorianCalendar và lớp java.time.ZonedDateTime? A. Instant.fromZonedDateTime(); B. date.toZonedDateTime(); C. zdt.toLocalTime(); D. cal.toZonedDateTime(); Đáp án D NGUYỄN ĐỨC HẬU - 20124977 8