Xác thực ngày tháng năm sinh là ngày tháng năm tồn tại thực trong PHP

Vậy là chúng ta đã tiến một bước khá dài trong việc xử lý, chuẩn hóa lượng lớn dữ liệu ngày tháng thông qua bài viết về phân tích dữ liệu thôviết hàm xử lý tổng quát.

Nhưng có một thiếu sót khá nghiêm trong trong các bài viết đó, đấy là nó xác thực được và đồng bộ cấu trúc ngày tháng năm, nhưng vẫn chưa chắc chắn được đó có phải là ngày tháng năm thực hay không. Điều này dễ xảy ra với số lượng không nhỏ trong một tệp dữ liệu lớn, dù tôi không hy vọng thực tế sẽ diễn ra như vậy.

Ví dụ ngày 29/2/2021 sẽ vượt qua bài kiểm tra chuẩn hóa ở trên, nhưng thực tế đây không phải là ngày tháng tồn tại thực sự vì nó không phải là năm nhuận nên tháng 2 chỉ có tối đa là 28 ngày.

Hàm PHP để chúng ta xác thực một cấu trúc có phải là ngày tháng thực sự không đấy là hàm checkdate(). Cấu trúc của nó như sau:

checkdate($thang,$ngay,$nam);

Giá trị trả về sẽ là TRUE nếu đúng, và FALSE nếu sai. Ví dụ checkdate(2,29,2021) sẽ trả về giá trị FALSE, trong khi checkdate(2,29,2020) là năm nhuận, đúng là ngày tồn tại thực sẽ trả về giá trị TRUE.

Có một điều chúng ta cần để ý là thứ tự trong hàm là tháng đặt trước sau đó đến ngày và cuối cùng là năm, đây là thói quen viết ngày tháng của nhiều nước phương Tây.

Một số điểm lưu ý khác:

  • Hàm vẫn trả về kết quả chính xác với việc ngày hoặc/và tháng có số 0 đằng trước, miễn là ngày đó là thực. Ví dụ checkdate(08,03,2005) có cùng kết quả với checkdate(8,3,2005)
  • Tuy nhiên năm thì không được phép như vậy, nó phải là số. Ví dụ checkdate(08,03,05) sẽ báo lỗi. Do vậy để bạn không nên để năm trong dữ liệu là dạng 2 số mà nên chuyển hết nó về dạng 4 số, hàm mẫu của chúng ta cũng đã xử lý điều này.

OK, bây giờ đến phần giải quyết. Hàm của nó sẽ thế này:

function ngaythuc($ntn) {
$c_ntn = explode('/', $ntn);
$ngay=$c_ntn[0];
$thang=$c_ntn[1];
$nam=$c_ntn[2];$nam=(int)$nam;
if (checkdate($thang,$ngay,$nam)==TRUE) {$kt=1;} else {$kt=0;}

return $kt;
}

Ở đây biến đầu vào là dữ liệu ngày tháng năm đã được chuẩn hóa. Chúng ta dùng hàm explode để cắt chuỗi ngày tháng năm đưa nó vào mảng, và lấy theo thứ tự mảng để có các giá trị tương ứng.

Kết quả của hàm sẽ trả về 1 nếu đúng là ngày thực, trả về 0 nếu không phải, và dữ liệu đầu vào kiểm tra có thứ tự bình thường như người Việt Nam hay dùng đó là ngày tháng năm.

Bạn có thể tích hợp hàm này vào phần gần cuối của hàm trước mà chúng ta đã viết để nó kiểm tra tổng thể một lượt.