Skip navigation.

Log in | Sign up

My little corner on MyOpera

Simple life :)

Determining the Number of Days in a Month with Javascript

,

Cuối tuần vừa rồi, bác Cảnh (my leader) có triển khai 1 task cho tôi với nội dung là: "chỉnh lại core của con calendar.js để ngày mặc định khi hiệp popup calendar sẽ là ngày hiện tại cộng một" (dĩ nhiên nếu đã nhập ngày trước đó rồi thì vẫn phải focus đúng).

Rất may là con calendar của tác giả Alf Magne Kalleland đã xử lý việc focus ngày nếu text field đã có giá trị nên việc của tôi lúc này khá nhàn hạ:

- Nếu textfield đã có giá trị rồi thì ko làm gì cả
- Nếu chưa có:
+ Lấy ngày hiện tại & cộng thêm 1 đơn vị
+ Nếu giá trị vừa cộng > tổng số ngày trong tháng hiện tại thì tăng tháng lên 1 đơn vị & ngày hiện tại = 1
+ Nếu tháng vừa cộng > 12 thì tăng năm hiện tại lên 1, ngày & tháng hiện tại = 1

Cái khó ở đây chính việc xác định tổng số ngày trong tháng bằng Javascript. Khó ở đây không phải thuật toán, khó ở đây chỉ đơn giản là làm thế nào để viết...càng ngắn càng tốt.

Nếu làm theo kiểu như trong các sách họp lập trình hoặc trong trường học thì sẽ phải if else (switch case) các tháng 30 ngày (4, 6, 9, 11), tháng có 31 ngày (1, 3, 5, 7, 8, 10, 12) và tháng 2 có 28 ngày (năm nhuận sẽ là 29). Ở đây lại phải xác định năm nhuận là năm như thế nào (chia hết cho 400), dài dòng ghê p:

Đối tượng Date của Javascript cho quá tải tham số date truyền vào & sẽ tự động tính toán số dư ngày thừa ra đó theo ngày hiện tại. Do đó để tính số ngày trong 1 tháng bằng Javascript chỉ cần dùng 1 dòng sau:
function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

Keke... vậy là task 1 giờ đã được giải quyết trong vòng chưa đầy 5'. Suỵt, bí mật :D

Mirror: http://donamkhanh.com/2009/11/01/determining-the-number-of-days-in-a-month-with-javascript.html

Use synchronous request in jQuery.ajaxIE message: Operation aborted

Comments

dungnh 1. November 2009, 16:25

Việc đưa 32 vào rất thú vị :D Còn tôi thì thường làm theo cách là: Nếu new Date(year, month, 0) thì sẽ trả về Date object ứng với ngày cuối cùng của tháng-trước-đó. getDate() của đối tượng này thì ra được số ngày của tháng trước đó.

Vậy hàm trên có thể viết thành:

return new Date( iYear, iMonth + 1, 0 ).getDate();

:D

namkhanh 2. November 2009, 02:34

Wow, cách của bạn còn ngắn hơn ^^ Cám ơn bạn đã chia sẻ nha :love:

dial911 12. November 2009, 09:11

Anh ơi. Dạo này pót bài mới. Chỉnh chữ đậm, nghiêng, chèn ảnh cứ khó khăn thế nào ấy? Sao anh nhỉ?

dial911 18. November 2009, 01:04

Đây là lỗi của opera hay sao?

zendobk 20. November 2009, 03:46

@dial911: Mình chả bị như thế, chắc do trình duyệt bạn bị lỗi, hoặc giả là ai đó (táy máy) thay đổi font mặc định của trình duyệt, bạn xem lại thử.
@anh Nam Khánh: anh là coder hả :D cho em làm quen với nhá :D em cũng coder (newbie) :D rất mong được học hỏi :D

namkhanh 20. November 2009, 15:50

@dial911: anh cũng không rõ lắm, ít xài tới format trong bài viết nên cũng ko để ý

@zendobk: anh là web developer :o:

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies

Download Opera, the fastest and most secure browser
December 2009
M T W T F S S
November 2009January 2010
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 30 31