30/09/2018, 23:13
Cần source code về tạo lịch ngày tháng năm
Mình cần cái ý tưởng, thủ thuật để xây dưng lịch trên android ạ, đang tập tành. Hi vọng mọi người có thể chia sẻ java, c, c# gì cũng đc ạ
Bài liên quan
Một bài viết hay (JS) bạn có thể tham khảo http://kipalog.com/posts/Phuc-tap-hoa-van-de--Datepicker-va-cac-thuat-toan-dang-sau-no
cái này chung guy gộp về bài toán tìm ngày đầu tiên trong tháng là ngày thứ mấy, mình cũng có tự chế ra 1 hàm để làm điều này:
có điều nó chỉ đúng được cho những năm trong đoạn [1901,2099]. Cái leap year trick vãi ra Vì cái leap year làm xấu code nên mình bỏ nó luôn, cho năm trong đoạn [1901,2099] thì chỉ cần lấy y%4 là ra năm nhuận rồi.
để mò ra được hàm này thì ta bắt đầu với ngày đầu tiên trong năm là ngày thứ mấy:
test cases là
nghĩa là ngày 1/1/1901 là ngày thứ ba, 1/1/1902 là thứ 4, v.v… Ta nhận thấy với năm 1901, 1902, 1903, 1904 thì chỉ cần
return ((y-1901)+2) % 7;
là ra. Nhưng tới 1905 thì có ngoại lệ: thay vì cộng 1 ngày, ta cần cộng 2 ngày (vì 1904 là năm nhuận), hay tổng quát hóa là ta cần cộng số năm nhuận tính từ năm 1901. Vậy sửa code thành:thử với 2015: 2015 - 1901 = 114.
114 + 114/4 = 114 + 28 = 142.
142 + 2 = 144.
144 % 7 = 4 => pass test
công thức tính năm nhuận được đơn giản hóa chỉ còn
y%4
nên mới phải giới hạn trong 200 năm 1901-2099tiếp theo là tìm ngày đầu tiên trong tháng là ngày thứ mấy:
ta bắt đầu với 12 test case trong năm ko nhuận, vd 2015 đi:
cái này nếu có số ngày trong tháng thì cũng ra dễ thôi, nhưng thay vì làm vậy, chúng ta chỉ cần nhìn vào bảng test mà suy luận thì cũng ra: vì chúng ta đã biết ngày 1/1 là ngày thứ mấy, 11 tháng còn lại chỉ xê dịch xung quanh ngày này thôi:
thành ra được mảng:
rồi update 3 dòng code cũ kia, thêm cái mảng này với 1 dòng nữa là ra:
nhưng chưa hết, còn trong năm nhuận thì sao?
phân tích ra thì ta thấy chỉ cần 1 thay đổi nhỏ, đó là với
m > 2
thì chỉ cần +1 ngày là đủ. Đương nhiên là phải trong năm nhuận mới +1. Vậy chỉ cần thêm 1 dòng nữa:cuối cùng là tìm thứ cho ngày bất kì. Cái này dễ nhất chỉ cần cộng
d
vàowd
nữa là hết Nhưng vì ngày đầu tiên là 1 rồi, thành thử phải là wd += d - 1, nhưng khi return ta return (wd+2) % 7, vậy sửa lại là (wd+1)%7 cho wd += d nó đẹp:Source code để làm gì không biết, việc tính ngày tháng năm là việc phổ biến nhất nên trong lập trình Java, Android và mấy ngôn ngữ hiện đại ngày nay đều đã có API để thực hiện.
Lo mà học sử dụng API thì hơn.
cảm ơn các bạn đã chia sẻ nhé
Lúc trước rảnh tìm trên internet rồi ngồi code liên quan đến mấy món này.
Tham khảo: https://github.com/minhhuy150894/Time-Calc