google+javascriptbanktwitter@js_bankfacebook@jsbankrss@jsbank






Hướng dẫn kiểm tra định dạng ngày tháng hợp lệ với JavaScript Trong bài viết hôm nay, jsB@nk muốn hướng dẫn bạn chi tiết cách thức để kiểm tra định dạng hợp lệ của thời điểm, thời gian bằng JavaScript. Bài viết hướng dẫn khá chi tiết, cung cấp hầu hết các trường hợp khả dĩ bạn có thể gặp đồng thời có các giải pháp đa dạng để xử lý.

Đặc biệt bài viết này chỉ dùng mã JavaScript cơ bản mà không sử dụng bất kì thư viện JavaScript nào nên bạn sẽ dễ dàng tiếp cận các ý tưởng xử lý hơn.

Xem thêm các hiệu ứng JavaScript, mã nguồn JavaScript khác về ngày tháng, thời gian nếu bạn muốn:
- Các tiện ích chọn thời gian, ngày tháng với JavaScript
- jsDatePick - Bộ chọn ngày miễn phí trên web
- JavaScript Đồng hồ đếm ngược


Nhãn: kiểm tra, định dạng ngày tháng, thời điểm, giải pháp, mã JavaScript cơ bản

Miễn phí web hosting 1 năm đầu tại iPage



Nếu bạn vẫn còn đang tìm kiếm một nhà cung cấp hosting đáng tin cậy, tại sao không dành chút thời gian để thử với iPage, chỉ với không quá 40.000 VNĐ/tháng, nhưng bạn sẽ được khuyến mãi kèm với quà tặng trị giá trên 10.000.0000 VNĐ nếu thanh toán cho 24 tháng ~ 900.000 VNĐ?

Có trên 1 triệu khách hàng hiện tại của iPage đã & đang hài lòng với dịch vụ, tuyệt đối chắc chắn bạn cũng sẽ hài lòng giống họ! Quan trọng hơn, khi đăng ký sử dụng web hosting tại iPage thông qua sự giới thiệu của chúng tôi, bạn sẽ được hoàn trả lại toàn bộ số tiền bạn đã sử dụng để mua web hosting tại iPage. Wow, thật tuyệt vời! Bạn không phải tốn bất kì chi phí nào mà vẫn có thể sử dụng miễn phí web hosting chất lượng cao tại iPage trong 12 tháng đầu tiên. Chỉ cần nói chúng tôi biết tài khoản của bạn sau khi đăng ký.

Nếu muốn tìm hiểu thêm về ưu / nhược điểm của iPage, bạn hãy đọc đánh giá của ChọnHostViệt.com nhé!
Thử iPage miễn phí cho năm đầu tiên NGAY

When capturing information for insertion into a database, or use in other processing, it's important to control what the user can enter. Otherwise you can end up with values in the database that have no relation to reality.

Checking for valid format

In this example, the date fields will only accept input that matches the pattern 'dd/mm/yyyy' (this could just as easily be changed to 'yyyy-mm-dd' or 'mm/dd/yyyy'). The time field will allow input starting with 'hh:mm' following by an optional 'am' or 'pm'. The fields can also be empty.

Event Details (dd/mm/yyyy) (eg. 05:37 or 5:37am) (eg. 3/4/2011)

The code behind the form is as follows:

  function checkForm(form)
  {
    // regular expression to match required date format
    re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;

    if(form.startdate.value != '' && !form.startdate.value.match(re)) {
      alert("Invalid date format: " + form.startdate.value);
      form.startdate.focus();
      return false;
    }
    if(form.enddate.value != '' && !form.enddate.value.match(re)) {
      alert("Invalid date format: " + form.enddate.value);
      form.enddate.focus();
      return false;
    }

    // regular expression to match required time format
    re = /^\d{1,2}:\d{2}([ap]m)?$/;

    if(form.starttime.value != '' && !form.starttime.value.match(re)) {
      alert("Invalid time format: " + form.starttime.value);
      form.starttime.focus();
      return false;
    }

    alert("All input fields have been validated!");
    return true;
  }

For each field in the form (first the dates, then the time field), a check is made as to whether the input is blank. If not, the input is compared to the regular expression. The expressions use a pre-defined class \d which represents any numeric character (0-9).

If you wanted to be really finicky the regular expression to match a date could also be written as:

re = /^[0-3]?[0-9]\/[01]?[0-9]\/[12][90][0-9][0-9]$/

If the input doesn't match the regular expression then an error message is presented, the routine stops the form from submitting by returning a false value and the focus is moved to the relevant form field.

If all tests are passed, then a value of true is returned which enables the form to be submitted.

Note: The routine does not check that the date or time input is valid, just that it matches the required format.

Checking for valid input values

Once you're in control of the input format, it's a lot easier to check that the values are actually valid. The function has been improved now so that the day, month and year values are checked to ensure that they're in the right ball-bark (ie. 1-31 for the day and 1-12 for the month). Also the year must be between 1902 and the current year.

The year limitation would be used if you were asking for a date of birth or date of some recent event. If you're setting up a calendar of future events you would check that the year is the current year or greater.

Event Details (dd/mm/yyyy) (eg. 05:37 or 5:37am) (eg. 3/4/2011)

The code behind the form now is as follows:

  function checkForm(form)
  {
    // regular expression to match required date format
    re = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;

    if(form.startdate.value != '') {
      if(regs = form.startdate.value.match(re)) {
        if(regs[1] < 1 || regs[1] > 31) {
          alert("Invalid value for day: " + regs[1]);
          form.startdate.focus();
          return false;
        }
        if(regs[2] < 1 || regs[2] > 12) {
          alert("Invalid value for month: " + regs[2]);
          form.startdate.focus();
          return false;
        }
        if(regs[3] < 1902 || regs[3] > (new Date()).getFullYear()) {
          alert("Invalid value for year: " + regs[3] + " - must be between 1902 and " + (new Date()).getFullYear());
          form.startdate.focus();
          return false;
        }
      } else {
        alert("Invalid date format: " + form.startdate.value);
        form.startdate.focus();
        return false;
      }
    }

    if(form.enddate.value != '') {
      if(regs = form.enddate.value.match(re)) {
        if(regs[1] < 1 || regs[1] > 31) {
          alert("Invalid value for day: " + regs[1]);
          form.enddate.focus();
          return false;
        }
        if(regs[2] < 1 || regs[2] > 12) {
          alert("Invalid value for month: " + regs[2]);
          form.enddate.focus();
          return false;
        }
        if(regs[3] < 1902 || regs[3] > (new Date()).getFullYear()) {
          alert("Invalid value for year: " + regs[3] + " - must be between 1902 and " + (new Date()).getFullYear());
          form.enddate.focus();
          return false;
        }
      } else {
        alert("Invalid date format: " + form.enddate.value);
        form.enddate.focus();
        return false;
      }
    }

    // regular expression to match required time format
    re = /^(\d{1,2}):(\d{2})([ap]m)?$/;

    if(form.starttime.value != '') {
      if(regs = form.starttime.value.match(re)) {
        if(regs[3]) {
          if(regs[1] < 1 || regs[1] > 12) {
            alert("Invalid value for hours: " + regs[1]);
            form.starttime.focus();
            return false;
          }
        } else {
          if(regs[1] > 23) {
            alert("Invalid value for hours: " + regs[1]);
            form.starttime.focus();
            return false;      
          }
        }
        if(regs[2] > 59) {
          alert("Invalid value for minutes: " + regs[2]);
          form.starttime.focus();
          return false;      
        }
      } else {
        alert("Invalid time format: " + form.starttime.value);
        form.starttime.focus();
        return false;
      }
    }

    alert("All input fields have been validated!");
    return true;
  }

expand code box

If you're not already familiar with regular expressions, then this might be getting a bit complicated. Basically, for each of the regular expression tests, an array is returned holding each component of the pattern that we've matched.

For example, when the date is checked, the return value, regs, is an array with elements 1 through 3 containing the day, month and year components of the input string. For the time check, the array returned includes the hour (pos 1), minutes (pos 2) and, optionally, the am/pm string (pos 3).

Each of these values is then tested against an allowed range (days: 1 - 31; months: 1 - 12; years: 1902 - present; ...).

Note: This still doesn't confirm that the date is valid. To do that you need to take into account variation between calendar months and leap-/non leap-years which is beyond the scope of this example. The following article on Form Validation: Credit Cards and Dates addresses this issue a bit better.

JavaScript theo ngày


Google Safe Browsing McAfee SiteAdvisor Norton SafeWeb Dr.Web