Chuyển đến nội dung chính
Yêu thích

Cấu trúc và phương pháp tính toán của công cụ tính ngày

Lịch mà chúng ta sử dụng hàng ngày có cấu trúc phức tạp. Các tháng có số ngày khác nhau, và cứ bốn năm lại có thêm một ngày trong năm. Do sự không đồng đều này, không thể chỉ sử dụng toán học thông thường để tính toán ngày tháng. Công cụ tính ngày không thể chỉ đơn giản cộng hay trừ các con số, mà cần một thuật toán chuyển đổi đặc biệt.

Cơ sở của mọi công cụ tính ngày là khái niệm chuyển đổi ngày lịch sang định dạng tuyến tính. Điều này cần thiết để làm việc với thời gian như một đường thẳng liên tục, nơi mỗi ngày được gán một số thứ tự riêng.

Biểu diễn tuyến tính của ngày tháng và điểm mốc

Hệ thống không thể trực tiếp "trừ" ngày 15/03 từ ngày 10/02, vì các ngày này thuộc các tháng khác nhau với số ngày khác nhau. Để giải quyết vấn đề này, công cụ tính ngày sử dụng "kỷ nguyên" – một ngày được cố định nghiêm ngặt trong quá khứ, được coi là điểm mốc số không.

Người dùng nhập ngày, thuật toán tra cứu lịch tích hợp và tính toán xem bao nhiêu ngày đã trôi qua từ kỷ nguyên đến ngày đã chỉ định. Tại thời điểm này, lịch trở thành một chuỗi số thông thường: 1, 2, 3, 4 và tiếp tục.

Phương pháp tính toán sự khác biệt giữa các ngày

Khi cần biết số ngày giữa hai sự kiện, thuật toán hoạt động theo một trình tự nghiêm ngặt.

  1. Ngày đầu tiên được nhập được chuyển sang định dạng số (số ngày từ kỷ nguyên).
  2. Ngày thứ hai được nhập cũng được chuyển sang định dạng số theo cách tương tự.
  3. Từ số lớn hơn trừ đi số nhỏ hơn.

Kết quả nhận được là số ngày lịch chính xác giữa các sự kiện. Nếu người dùng cần kết quả theo năm và tháng, công cụ tính ngày không chia số cho 30 hay 365. Thuật toán bắt đầu "quay ngược" số ngày đã nhận từ ngày bắt đầu, tính riêng các năm đầy đủ, sau đó các tháng đầy đủ, và chỉ phần dư còn lại được hiển thị là ngày.

Thuật toán cộng và trừ khoảng thời gian

Việc cộng ngày đơn giản hoạt động qua mô hình tuyến tính: vào số thứ tự của ngày bắt đầu được cộng thêm số ngày cần thiết, sau đó kết quả được chuyển đổi ngược lại thành lịch. Nhưng với việc cộng tháng và năm, tình huống phức tạp hơn do việc "nhảy qua" các ranh giới tháng có độ dài khác nhau.

Nếu cần cộng một tháng vào ngày 31/01, thuật toán không tìm "ngày 31 tiếp theo" trong lịch. Nó tăng chỉ số tháng lên một đơn vị và kiểm tra xem ngày 31 có tồn tại trong tháng 2 hay không. Vì tháng 2 có tối đa 28 hoặc 29 ngày, xảy ra xung đột.

Trong các tình huống như vậy, công cụ tính ngày sử dụng phương pháp "cắt ngắn". Hệ thống ghi nhận ngày 28 (hoặc 29)/02 là ngày kết thúc. Nếu thuật toán cơ học cộng 30 ngày vào ngày 31/01, kết quả sẽ là ngày 02/03, điều này sẽ vi phạm logic của việc cộng chính xác một tháng lịch.

Tính toán năm nhuận

Để chuyển đổi chính xác ngày tháng sang định dạng số và ngược lại, công cụ tính ngày phải biết chính xác độ dài của mỗi năm. Thuật toán kiểm tra năm theo bộ lọc toán học gồm ba điều kiện.

Đầu tiên, năm được kiểm tra tính chia hết cho bốn. Nếu năm không chia hết cho 4, nó ngay lập tức được coi là năm thường (365 ngày). Nếu chia hết, hệ thống chuyển sang điều kiện thứ hai và kiểm tra tính chia hết cho 100. Năm nhuận không được chia hết cho 100. Tuy nhiên, ở đây có điều kiện thứ ba: nếu năm chia hết cho 100, nó trở thành năm nhuận chỉ trong trường hợp nó còn chia hết cho 400.

Nhờ kiểm tra này, công cụ tính ngày biết rằng năm 2000 là năm nhuận, còn năm 1900 thì không. Thông tin này được tính đến trong thuật toán chuyển đổi ngày, đảm bảo độ chính xác 100% khi vượt qua ranh giới tháng 2 trong bất kỳ giai đoạn lịch sử nào.

Xác định ngày trong tuần

Khi chuyển đổi số thứ tự của ngày ngược lại thành lịch, công cụ tính ngày cũng tính toán ngày trong tuần. Vì các ngày đi theo nhau nghiêm ngặt, và tuần luôn gồm bảy ngày, hệ thống sử dụng phép toán lấy phần dư của phép chia (modulo).

Số thứ tự của ngày cần tìm được chia cho 7. Phần dư của phép chia này chỉ ra ngày cụ thể trong tuần. Nếu phần dư bằng không, đó là ngày thứ bảy trong tuần, bằng một – ngày đầu tiên. Phương pháp này loại bỏ nhu cầu lưu trữ các bảng tra cứu khổng lồ về ngày trong tuần cho mỗi ngày trong lịch sử.

Tính toán ngày làm việc

Để tính toán ngày làm việc, công cụ tính ngày áp dụng phương pháp lọc. Đầu tiên, tổng số ngày lịch giữa các ngày được tính theo mô hình tuyến tính. Sau đó, thuật toán đi qua từng ngày đã nhận và xác định ngày trong tuần của nó thông qua phép chia modulo.

Các ngày rơi vào cuối tuần (các số dư cụ thể phụ thuộc vào ngày nào bắt đầu tuần), được loại khỏi tổng số. Để tính toán có tính đến ngày lễ, vào quy trình này được thêm việc kiểm tra từng ngày làm việc theo cơ sở dữ liệu ngày lễ. Nếu ngày trùng với ngày lễ từ cơ sở dữ liệu, nó cũng được trừ khỏi kết quả cuối cùng.

Kiến trúc độ chính xác

Công cụ tính ngày dựa trên logic toán học nghiêm ngặt. Việc chuyển đổi lịch thành chuỗi số liên tục giải quyết vấn đề chính – sự không đồng đều của các tháng và năm nhuận. Nhờ mô hình tuyến tính, kiểm tra tính chia hết và thuật toán cắt ngắn khi vượt qua ranh giới các tháng, hệ thống loại bỏ các sai sót. Số học modulo đảm bảo xác định ngày trong tuần mà không cần cơ sở dữ liệu nặng nề. Kết quả là người dùng nhận được kết quả chính xác bất kể độ phức tạp của tác vụ.


Khái niệm chuyển đổi tuyến tính ngày tháng được mô tả ở trên là logic cơ bản, giúp hiểu bản chất của các thuật toán. Tuy nhiên, trong thực tế, các công cụ web hiện đại hoạt động với độ chính xác còn cao hơn. Trong cấu trúc của các ứng dụng như vậy (bao gồm dự án của chúng tôi), JavaScript được sử dụng, nơi việc tính ngày và thời gian được thực hiện không phải theo ngày, mà theo mili-giây.