如何使用C ++根据周代码而不是当前日期获取到期日期

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

如何获取基于周代码的项目的到期日期?每当我 运行 我制作的代码时,程序都会读取当前日期并忽略周代码。例如:

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;

周码是日期码,例如2138,年2021(21)周38(38)。第38周为2021年9月19日至2021年9月25日左右

现在的问题是,我将如何获得基于周代码的到期日期?我还会使用“GetCurrentTime”吗?

下面是我将如何使用 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';
}

这假设您正在使用 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 来创建带有此 yearweeknum 的生产日期。要完成此日期,必须提供 weekday。我选择了星期三,因为这是 ISO 工作周的中间时间。

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

然后可以通过简单地在该日期上加上 6 个月来计算到期日期。请注意,此添加是使用 完成的,因为产品老化是一个物理过程,不关心不同月份的长度不同。使用“平均月”长度就足够了。

要进行此时间顺序计算,必须先将生产日期转换为时间顺序,sys_days。这只是自 Unix Time 纪元以来的天数。

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

结果的精度高于天数,因为平均月持续时间不是天数的整数倍。因此必须将它截断回 days 的精度来创建日期,而不是 date-time.

以上程序打印出来:

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