TopDev

Cách tạo lịch bằng code java

minhu 📖 7 phút đọc 💬 2 phản hồi

Dưới đây là hàm Java để tạo lịch 5 tuần của một tháng, với đầu vào là ngày hiện tại:

Cách tiếp cận:#

  • Nhập ngày hiện tại: Dùng lớp LocalDate từ Java để làm việc với ngày tháng.

  • Tính toán lịch tháng: Xác định ngày đầu tiên của tháng.

    • Tìm ngày bắt đầu của tuần đầu tiên (lùi về thứ Hai của tuần đó).

    • Lập mảng 5 tuần và lấp đầy các giá trị ngày tháng.

Mã nguồn:#

` import java.time.LocalDate; import java.time.DayOfWeek; import java.util.Arrays;

public class CalendarGenerator {

public static String[][] generateCalendar(LocalDate currentDate) {
    String[][] calendar = new String[5][7]; // 5 tuần x 7 ngày

    // Xác định ngày đầu tiên và cuối cùng của tháng
    LocalDate firstDayOfMonth = currentDate.withDayOfMonth(1);
    LocalDate lastDayOfMonth = currentDate.withDayOfMonth(currentDate.lengthOfMonth());

    // Xác định ngày bắt đầu của tuần đầu tiên (thứ Hai gần nhất hoặc chính nó)
    LocalDate startOfCalendar = firstDayOfMonth.with(DayOfWeek.MONDAY);
    if (startOfCalendar.isAfter(firstDayOfMonth)) {
        startOfCalendar = startOfCalendar.minusWeeks(1);
    }

    // Điền các giá trị ngày vào bảng lịch
    LocalDate dayPointer = startOfCalendar;
    for (int week = 0; week < 5; week++) {
        for (int day = 0; day < 7; day++) {
            if (dayPointer.isBefore(firstDayOfMonth) || dayPointer.isAfter(lastDayOfMonth)) {
                calendar[week][day] = ""; // Ngày ngoài tháng
            } else {
                calendar[week][day] = String.valueOf(dayPointer.getDayOfMonth());
            }
            dayPointer = dayPointer.plusDays(1);
        }
    }

    return calendar;
}

public static void printCalendar(String[][] calendar) {
    String[] daysOfWeek = {"Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy", "Chủ nhật"};
    System.out.println(String.join("\t", daysOfWeek));
    for (String[] week : calendar) {
        System.out.println(String.join("\t", Arrays.stream(week).map(day -> day.isEmpty() ? " " : day).toArray(String[]::new)));
    }
}

public static void main(String[] args) {
    LocalDate currentDate = LocalDate.of(2024, 12, 15); // Thay đổi ngày hiện tại nếu cần
    String[][] calendar = generateCalendar(currentDate);
    printCalendar(calendar);
}

} `

Giải thích mã:#

  • generateCalendar: Tạo lịch 5 tuần dựa trên ngày hiện tại.

    • Xác định ngày đầu tiên và cuối cùng của tháng, sau đó lùi lại để bắt đầu từ thứ Hai của tuần đầu tiên.

    • Duyệt qua 5 tuần, điền ngày vào mảng calendar.

  • printCalendar: Hiển thị lịch bằng cách in ra theo cột (các thứ trong tuần).

  • Dữ liệu đầu vào: Hàm nhận LocalDate làm đầu vào, cho phép tính toán linh hoạt với các tháng khác nhau.

Kết quả đầu ra:#

Ví dụ với ngày 15/12/2024, chương trình sẽ in: Thứ hai Thứ ba Thứ tư Thứ năm Thứ sáu Thứ bảy Chủ nhật 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Nếu cần thêm tính năng (như đánh dấu sự kiện), hãy cho tôi biết!

2 phản hồi

  1. minhu #1

    Bạn muốn tạo một hàm Java để hiển thị lịch tháng 12 năm 2024 tương tự bảng trên? Nếu đúng vậy, tôi có thể hướng dẫn bạn viết một chương trình Java để in lịch tháng này. Dưới đây là một cách tiếp cận cơ bản:

    • Xác định cấu trúc dữ liệu: Sử dụng mảng hoặc danh sách để lưu các ngày và thông tin như ngày âm lịch, sự kiện, v.v.

    • Hiển thị lịch: Dùng vòng lặp để in từng tuần của tháng.

    Dưới đây là mã mẫu:

    ` import java.util.Arrays;

    public class CalendarDisplay { public static void main(String[] args) { String[][] calendar = { {"25", "26", "27", "28", "29", "30", "1 / 11 (Chủ nhật)"}, {"2", "3", "4", "5", "6", "7", "8"}, {"9", "10", "11", "12", "13", "14", "15"}, {"16", "17", "18", "19 (Toàn quốc kháng chiến)", "20", "21", "22 (Thành lập QĐNDVN)"}, {"23", "24", "25", "26", "27", "28", "29"}, };

        String[] daysOfWeek = {"Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy", "Chủ nhật"};
    
        // Print header
        System.out.println(String.join("\t", daysOfWeek));
    
        // Print calendar
        for (String[] week : calendar) {
            System.out.println(String.join("\t", week));
        }
    }
    

    } `

    Giải thích:#

    • Mảng calendar: Lưu từng tuần của tháng, với ngày và các sự kiện tương ứng.

    • Mảng daysOfWeek: Lưu thứ trong tuần.

    • Hiển thị: Dùng vòng lặp để in tuần theo định dạng bảng.

    Nếu bạn cần thêm thông tin, chẳng hạn như đánh dấu ngày "hoàng đạo" và "hắc đạo", hoặc thay đổi cách sắp xếp, tôi có thể hướng dẫn chi tiết hơn!

  2. minhu #2

    Dưới đây là phiên bản sửa đổi của hàm để hiển thị lịch 2 tháng liền kề, bắt đầu từ tháng hiện tại. Chương trình sẽ hiển thị 2 tháng (mỗi tháng 5 tuần), với định dạng gọn gàng.

    Mã nguồn:#

    ` import java.time.LocalDate; import java.time.DayOfWeek; import java.util.Arrays;

    public class TwoMonthCalendar {

    public static String[][] generateCalendar(LocalDate firstDayOfMonth) {
        String[][] calendar = new String[5][7]; // 5 tuần x 7 ngày
    
        // Xác định ngày đầu tiên và cuối cùng của tháng
        LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());
    
        // Xác định ngày bắt đầu của tuần đầu tiên (thứ Hai gần nhất hoặc chính nó)
        LocalDate startOfCalendar = firstDayOfMonth.with(DayOfWeek.MONDAY);
        if (startOfCalendar.isAfter(firstDayOfMonth)) {
            startOfCalendar = startOfCalendar.minusWeeks(1);
        }
    
        // Điền các giá trị ngày vào bảng lịch
        LocalDate dayPointer = startOfCalendar;
        for (int week = 0; week < 5; week++) {
            for (int day = 0; day < 7; day++) {
                if (dayPointer.isBefore(firstDayOfMonth) || dayPointer.isAfter(lastDayOfMonth)) {
                    calendar[week][day] = ""; // Ngày ngoài tháng
                } else {
                    calendar[week][day] = String.valueOf(dayPointer.getDayOfMonth());
                }
                dayPointer = dayPointer.plusDays(1);
            }
        }
    
        return calendar;
    }
    
    public static void printTwoMonthCalendar(String[][] firstMonth, String[][] secondMonth) {
        String[] daysOfWeek = {"Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy", "Chủ nhật"};
    
        // In tiêu đề cho 2 tháng
        System.out.println("Lịch tháng 1:\t\t\t\t\t\t\t\tLịch tháng 2:");
        System.out.println(String.join("\t", daysOfWeek) + "\t\t" + String.join("\t", daysOfWeek));
    
        // In từng tuần của cả hai tháng
        for (int week = 0; week < 5; week++) {
            String firstMonthWeek = String.join("\t", Arrays.stream(firstMonth[week]).map(day -> day.isEmpty() ? " " : day).toArray(String[]::new));
            String secondMonthWeek = String.join("\t", Arrays.stream(secondMonth[week]).map(day -> day.isEmpty() ? " " : day).toArray(String[]::new));
            System.out.println(firstMonthWeek + "\t\t" + secondMonthWeek);
        }
    }
    
    public static void main(String[] args) {
        LocalDate currentDate = LocalDate.of(2024, 12, 15); // Thay đổi ngày hiện tại nếu cần
        LocalDate firstMonth = currentDate.withDayOfMonth(1);
        LocalDate secondMonth = firstMonth.plusMonths(1);
    
        // Tạo lịch cho hai tháng
        String[][] firstMonthCalendar = generateCalendar(firstMonth);
        String[][] secondMonthCalendar = generateCalendar(secondMonth);
    
        // In lịch hai tháng
        printTwoMonthCalendar(firstMonthCalendar, secondMonthCalendar);
    }
    

    } `

    Giải thích mã:#

    • generateCalendar: Tạo lịch 5 tuần cho một tháng cụ thể.

      • Sử dụng LocalDate để tính toán ngày đầu tiên, cuối cùng và tuần đầu tiên của tháng.
    • printTwoMonthCalendar: Nhận hai mảng lịch của hai tháng.

      • Hiển thị tiêu đề "Tháng 1" và "Tháng 2" cùng các thứ trong tuần.

      • In từng tuần của hai tháng song song.

    • Chương trình chính (main): Tạo lịch cho tháng hiện tại và tháng tiếp theo.

      • Gọi hàm printTwoMonthCalendar để hiển thị.

    Kết quả đầu ra:#

    Với currentDate = LocalDate.of(2024, 12, 15), đầu ra sẽ như sau:

    Lịch tháng 1: Lịch tháng 2: Thứ hai Thứ ba Thứ tư Thứ năm Thứ sáu Thứ bảy Chủ nhật Thứ hai Thứ ba Thứ tư Thứ năm Thứ sáu Thứ bảy Chủ nhật 25 26 27 28 29 30 1 30 31 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 16 17 18 19 20 21 22 20 21 22 23 24 25 26 23 24 25 26 27 28 29 27 28 29 30 31

    Điểm nổi bật:#

    • Lịch hai tháng được hiển thị song song với các thứ trong tuần.

    • Những ngày ngoài tháng được để trống.

    • Linh hoạt để thay đổi tháng hoặc thêm sự kiện (nếu cần).

    Nếu bạn cần tùy chỉnh thêm (chẳng hạn thêm sự kiện hoặc đánh dấu ngày đặc biệt), hãy cho tôi biết!

Bài liên quan trong #Java

✓ Đã sao chép link