Menu
CoddyTech

Period và Duration

Thuộc phần Logic và luồng chương trình trong hành trình Java của Coddy. Bài học 57 trên 59.

Period biểu thị một khoảng thời gian tính theo ngày tháng (năm, tháng, ngày), còn Duration biểu thị một khoảng thời gian tính theo giờ (giờ, phút, giây).

Tạo một Period:

Period period = Period.of(1, 2, 15);
// 1 năm, 2 tháng, 15 ngày

Tạo một Duration:

Duration duration = Duration.ofHours(2);
// 2 giờ
Duration minutes = Duration.ofMinutes(90);
// 90 phút

Sau khi chạy đoạn code trên, period chứa:

P1Y2M15D  // Định dạng ISO-8601

Đo khoảng cách giữa hai ngày bằng Period.between(). Hàm này nhận hai giá trị LocalDate và chia khoảng cách thành năm, tháng và ngày:

LocalDate start = LocalDate.of(2024, 1, 15);
LocalDate end = LocalDate.of(2025, 3, 20);
Period p = Period.between(start, end);
p.getYears();   // 1
p.getMonths();  // 2
p.getDays();    // 5

getDays() chỉ trả về số ngày còn lại sau khi tính đủ số năm và tháng, chứ không phải tổng số ngày giữa hai ngày. LocalDateTime cung cấp ngày của nó bằng toLocalDate().

Đo khoảng cách giữa hai thời điểm bằng Duration.between(), hàm này nhận hai giá trị LocalDateTime (hoặc LocalTime):

LocalDateTime from = LocalDateTime.of(2024, 3, 15, 10, 30);
LocalDateTime to = LocalDateTime.of(2024, 3, 15, 14, 45);
Duration d = Duration.between(from, to);
d.toHours();        // 4
d.toMinutes();      // 255
d.toMinutesPart();  // 15

toMinutes() tính tổng khoảng cách theo phút, bao gồm cả giờ. toMinutesPart() trả về số phút còn lại sau khi tính đủ số giờ, nên khoảng cách này là 4 giờ 15 phút.

challenge icon

Thử thách

Dễ

Tạo một phương thức có tên calculateDifference nhận bốn đối số:

  1. Một String (start) theo định dạng "yyyy-MM-dd HH:mm"
  2. Một String (end) theo định dạng "yyyy-MM-dd HH:mm"
  3. Một String (unit) có giá trị "period" hoặc "duration"
  4. Một String (format) có giá trị "full" hoặc "simple"

Phương thức cần:

  1. Tính khoảng chênh lệch giữa ngày bắt đầu và ngày kết thúc
  2. Trả về khoảng chênh lệch theo định dạng đã chỉ định

Các thông báo trả về:

  • Nếu ngày không hợp lệ: trả về "Invalid date format"
  • Nếu đơn vị không hợp lệ: trả về "Invalid unit"
  • Nếu định dạng không hợp lệ: trả về "Invalid format"
  • Với khoảng thời gian có định dạng "full": "Years: X, Months: Y, Days: Z"
  • Với khoảng thời gian có định dạng "simple": "XyYmZd"
  • Với khoảng thời lượng có định dạng "full": "Hours: X, Minutes: Y", trong đó Y là số phút còn lại sau khi tính số giờ tròn
  • Với khoảng thời lượng có định dạng "simple": "XhYm"

Tự làm thử

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String calculateDifference(String start, String end, String unit, String format) {
        // Viết code của bạn ở đây
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String start = scanner.nextLine();
        String end = scanner.nextLine();
        String unit = scanner.nextLine();
        String format = scanner.nextLine();
        
        System.out.println(calculateDifference(start, end, unit, format));
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch Java online