Về cơ bản, có hai phương pháp:
Các/cách thuộc về thực hành dễ dàng: Giải quyết các nhiệm vụ, và quên đi mọi thứ khác. Ở đây bạn có thể kiểm tra tài liệu cho mktime()
(bạn sẽ tìm thấy một ví dụ dựa trên mktime bên dưới ..).
Cách khoa học/kỹ thuật: Tìm hiểu cách hoạt động! Bạn có thể bắt đầu tại số great wikipedia article about the gregorian calendar. Đọc nó, hiểu nó, và viết mã thực hiện các thuật toán cơ bản (là được biết đến, không có khoa học tên lửa, có thể). Điều này sẽ cải thiện kỹ năng của bạn rất nhiều (trên thực tế, bạn thực sự nên làm một điều như vậy, có thể không phải là lịch nhưng một chủ đề khác, nó sẽ cho bạn một bước nhảy vọt lớn trong sự hiểu biết tất cả điều).
Bây giờ, hãy bắt đầu một số mã thực dụng. mktime()
có một tính năng tuyệt vời: nó biết chi tiết lịch và nó chấp nhận ví dụ: một ngày "2010-01-60" và sẽ chuyển đổi nó thành 29 tháng 2 năm 2010. Nhưng, điều này sẽ chỉ làm việc cho những ngày sau năm 1970. Nó sẽ không hoạt động cho những ngày trước đó (mặc dù tôi không chắc chắn 100%, nhưng nó không nên ' t làm việc, bởi vì thời gian unix bắt đầu từ ngày 1 tháng 1 năm 1970, nhưng thử với các ngày khác, có lẽ mktime()
không bị giới hạn thời gian unix).
Pseudo-Code, điều này sẽ in mỗi ngày trên một dòng đơn (YYYY-MM-DD):
void print_cal(int year) {
static char weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
struct tm tm;
for(int day=0; day<365; ++day) {
memset(&tm, 0, sizeof(tm));
tm.tm_year = year - 1900;
tm.tm_mday = day;
mktime(&tm); // modifies tm
printf("%04d-%02d-%02d, %s\n", tm.tm_year, tm.tm_mon+1, tm.tm_mday, weekdays[tm.tm_wday]);
}
}
Mã này bỏ qua năm nhuận. Bạn vẫn phải điều chỉnh nó để chính xác cho những năm nhuận! Ngoài ra kết quả không phải là rất đẹp được nêu ra, chỉ là một dòng mỗi ngày.
EDIT: thêm đầu ra của các ngày trong tuần.
Nếu bạn có thể làm cho chương trình in các tuần đầu tiên của tháng, bạn sẽ có chương trình 90% thực hiện. –
Làm thế nào để anh ta bắt đầu tháng vào một ngày cụ thể –