การคำนวณวันที่ในอนาคตหรืออดีต

C++:
การคำนวณวันที่ในอนาคตหรืออดีต

วิธีการ:

C++20 ได้แนะนำการอัพเกรดไลบรารี <chrono> จึงทำให้การจัดการกับเวลาง่ายขึ้น นี่คือตัวอย่างการเพิ่มวันให้กับวันที่ปัจจุบัน:

#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;

int main() {
    // รับวันที่ของวันนี้
    auto today = floor<days>(system_clock::now());
    
    // เพิ่ม 30 วันให้กับวันนี้
    auto future_date = today + days(30);
    
    // แปลงเป็น time_point เพื่อแสดงผลโดยใช้ system_clock
    auto tp = system_clock::time_point(future_date);
    
    // แสดงผล
    std::cout << "วันที่ของวันนี้: "
              << std::format("{:%F}\n", today);
    std::cout << "วันที่ในอนาคต (30 วันถัดไป): "
              << std::format("{:%F}\n", tp);
    return 0;
}

ตัวอย่างผลลัพธ์:

วันที่ของวันนี้: 2023-03-15
วันที่ในอนาคต (30 วันถัดไป): 2023-04-14

การลบวันทำงานได้คล้ายกัน—คุณเพียงแค่ใช้ - แทน +.

ศึกษาเพิ่มเติม

ก่อน C++20, คุณอาจจะใช้ไลบรารีเช่น Boost เพื่อจัดการกับวันที่ แต่ <chrono> ที่ได้รับการอัพเดตทำให้ง่ายขึ้นด้วย system_clock, year_month_day, และการเปลี่ยนแปลง duration.

จากประวัติศาสตร์, การคำนวณวันที่เป็นเรื่องซับซ้อนเนื่องจากต้องจัดการกับความยาวของเดือนที่แตกต่างกัน, ปีอกสัมพันธ์, และเขตเวลาด้วยตนเอง C++20 <chrono> จัดการกับเรื่องเหล่านี้โดยการให้การสนับสนุนปฏิทินและเขตเวลา

ทางเลือกอื่น? คุณยังสามารถใช้ Boost หรือแม้กระทั่งสร้างตรรกะวันที่ของคุณเอง (ผจญภัย, แต่ทำไม?) ยังมีไลบรารีของบุคคลที่สามเช่นไลบรารี “date” ของ Howard Hinnant, ซึ่งมีอิทธิพลต่อการอัพเดต chrono ใน C++20

ในแง่ของการเป็นต้นแบบ, <chrono> กำหนดระยะเวลาเป็นค่าคงที่แบบมีเหตุผลในช่วงเวลาคอมไพล์, หลีกเลี่ยงปัญหาจุดลอยตัว ประเภทเช่น year_month_day พึ่งพา sys_days ซึ่งเป็นการแสดง time_point เป็นวันนับจากสมัยกลาง (1970-01-01)

ดูเพิ่มเติม