c++visual-studio-2015timespanctime

How to get the expiration date based on week code not on current date using c++


How will I get the expiration date of an item, which is based on week code? Whenever I run the code that I made, the program reads the current date and disregards the week code. For example:

Week Code: 2138 (2021 week 38)
Shelf_life : 6 months
CTime weekcode = CTime::GetCurrentTime();

CTimeSpan shelf_no = CTimeSpan(atoi(view->m_pODBCPartsNo->m_shelf_life), 0, 0, 0);

CTime expiration_date = weekcode = shelf_no;

Week code is a date code, for example 2138, year 2021(21) week 38(38). Week 38 is around September 19, 2021 to September 25, 2021.

Now the question is, how will i get the expiration date that is based on week code ? Will I still use "GetCurrentTime" ?


Solution

  • Here's how I would do it using Howard Hinnant's free, open-source, header-only date library:

    #include "date/iso_week.h"
    #include "date/date.h"
    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
    
        int weekcode = 2138;
        int shelf_life = 6;
    
        iso_week::year y{weekcode / 100 + 2000};
        iso_week::weeknum wk(weekcode % 100);
        auto prod_date = y/wk/iso_week::wed;
        auto exp_date = floor<days>(sys_days{prod_date} + months{shelf_life});
    
        std::cout << "Production date : " << prod_date << '\n';
        std::cout << "Expiration date : " << exp_date << '\n';
    }
    

    This assumes that you are using ISO week date as the definition of "week number", which is an internationally accepted standard. The program begins by simply decoding weekcode into a year and weeknum. It then uses the iso_week library to create a production date with this year and weeknum. To complete this date, a weekday must be supplied. I've chosen Wednesday since this is the middle of the ISO work week.

    auto prod_date = y/wk/iso_week::wed;
    

    The expiration date can then be computed by simply adding 6 months to that date. Note that this addition is done using a chronological computation because product aging is a physical process that does not care that different months have different lengths. Using an "average month" length is adequate.

    To do this chronological arithmetic, the production date must first be converted to a chronological date, sys_days. This is simply a count of days since the Unix Time epoch.

    auto exp_date = floor<days>(sys_days{prod_date} + months{shelf_life});
    

    The result has a precision finer than days since the average month duration is not an integral number of days. So it must be truncated back to the precision of days to create a date, as opposed to a date-time.

    The above program prints out:

    Production date : 2021-W38-Wed
    Expiration date : 2022-03-23