如何获得基于周代码的项的过期日期?每当我运行我编写的代码时,程序就会读取当前日期,而忽略了周代码。例如:
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“吗?
发布于 2022-03-16 19:17:34
下面是我如何使用Hinnant的免费的、开源的、仅限头的日期库来做这件事
#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周日期作为“周号”的定义,这是一个国际公认的标准。该程序从简单地将weekcode
解码为year
和weeknum
开始。然后,它使用图书馆来使用这个year
和weeknum
创建一个生产日期。若要完成此日期,必须提供weekday
。我选择了星期三,因为这是ISO工作周的中间时间。
auto prod_date = y/wk/iso_week::wed;
然后,只需将6个月添加到该日期,即可计算到期日。请注意,此添加是使用时间计算完成的,因为产品老化是一个物理过程,不关心不同月份的长度不同。使用“平均月”长度就足够了。
若要执行此时间顺序算法,必须首先将生产日期转换为时间日期( sys_days
)。这只是从Unix时间时代开始的几天的统计。
auto exp_date = floor<days>(sys_days{prod_date} + months{shelf_life});
由于月平均持续时间不是天数的整数,所以结果比天数更精确。因此,必须将其截断回days
的精度,以创建日期,而不是日期时间。
上面的程序输出:
Production date : 2021-W38-Wed
Expiration date : 2022-03-23
https://stackoverflow.com/questions/71505585
复制相似问题