- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果给定特定年份的周数,我如何使用 C/C++ 轻松确定一周的第一个和最后一个日期(日和月)?提前致谢!
李
最佳答案
旧问题的新答案。
此答案包括提议用于标准化但被拒绝的代码。我提到的原因是代码在命名空间 std::chrono
中为提案的目的。但重要的是要意识到这个提议没有被接受,因此如果你使用它,你应该将提议的部分移到你自己的命名空间中。它们不是任何标准的一部分,甚至不被考虑用于标准化!
这里是 user documentation for my date class这使得这个计算相当容易(假设 ISO 标准周编号)。文档指向一个标题 <date>
和一个来源date.cpp实现提案。
使用这些资源和下面显示的两个非常简短的辅助函数,这里是一个程序,它需要周数和年份,并以民用(公历)打印出该周的第一天(星期一)和最后一天(星期日) ) 日历:
#include "date"
#include <utility>
#include <iostream>
std::chrono::date
week_to_date(int weeknum, std::chrono::weekday wd, std::chrono::year y)
{
using namespace std::chrono;
return (mon <= jan/_4th/y) + days((weeknum - 1)*7 + (wd == 0 ? 6 : wd - 1));
}
std::pair<std::chrono::date, std::chrono::date>
get_dates(unsigned week_num, unsigned y)
{
using namespace std::chrono;
return std::make_pair(week_to_date(week_num, mon, year(y)),
week_to_date(week_num, sun, year(y)));
}
int main()
{
auto p = get_dates(9, 2013);
std::cout << p.first << '\n';
std::cout << p.second << '\n';
}
对我来说,这是打印出来的:
2013-02-25
2013-03-03
week_to_date
中的返回语句可以使用一些解释:
(mon <= jan/_4th/y)
上述表达式构造了一个日期,它是 y 年 1 月 4 日或之前的星期一。然后我在 weeknum
之前每周添加 7 天到那个日期:
+ days((weeknum - 1)*7
最后如果工作日 ( wd
) 是星期天,我添加 6 天,否则我添加 wd-1
星期一 == 1,星期二 == 2,星期六 == 6(星期日 == 0)。
+ (wd == 0 ? 6 : wd - 1))
最后一步是考虑到基于 ISO 周的日历周从星期一开始,而这个日期类的实现遵循从星期日开始的一周的 C/C++ 约定。
proposal实际上包括 week_to_date
的定义和基于 ISO 周的年份,尽管这些在提案中只是作为如何使用日期类的示例,而不是提案的一部分。
请随意使用代码,但我强烈建议先将其从命名空间 std 中删除。源代码足够短,像这样的小修改应该不难。
更新
这个答案的链接已经过时了,所以我更新了它们。但是,除了更新链接之外,我还想提请注意重新设计上面链接的库。重新设计将新的重点放在效率上,包括在编译时已知所有输入时的编译时日期计算。
如果支持 C++14,“日期常量”现在是真实的。
这个重新设计的库是 documented here使用从文档链接的单个 header 实现。语法与上面的语法相似,但不完全相同:
#include "date.h"
#include <iostream>
constexpr
date::year_month_day
week_to_date(int weeknum, date::weekday wd, date::year y)
{
using namespace date;
auto const dp = sys_days(jan/4/y);
auto const wdjan4 = weekday(dp);
return dp - (wdjan4 - mon)
+ days((weeknum - 1)*7 + (wd == sun ? 6 : static_cast<unsigned>(wd) - 1));
}
constexpr
std::pair<date::year_month_day, date::year_month_day>
get_dates(int week_num, date::year y)
{
using namespace date;
return std::make_pair(week_to_date(week_num, mon, y),
week_to_date(week_num, sun, y));
}
int
main()
{
using namespace date;
constexpr auto p = get_dates(9, 2013_y);
static_assert(p.first == feb/25/2013, "");
static_assert(p.second == 2013_y/mar/3, "");
std::cout << p.first << '\n';
std::cout << p.second << '\n';
}
两个主要区别是(在 C++14 中)可以进行计算 constexpr
.和 operator<=
不再可用于查找工作日等于或早于某个日期的日期。相反,此功能由“工作日减法”处理,这始终会产生正数(从工作日 1 到工作日 2 需要多少天?)。
这个程序的输出和之前的版本一样:
2013-02-25
2013-03-03
现在最大的不同是编译时常量被输出到 std::cout
.但是相同的代码(减去 static_asserts
)在运行时输入时工作得很好。
节拍继续
将上面介绍的库与新的兼容的 "iso_week.h"
相结合库,大大简化了上述计算的语法:
#include "date.h"
#include "iso_week.h"
#include <iostream>
int
main()
{
using namespace iso_week::literals;
auto y = 2013_y;
auto wn = 9_w;
std::cout << "The dates for " << y/wn << " are "
<< date::year_month_day{y/wn/mon} << " through "
<< date::year_month_day{y/wn/sun} << '\n';
}
哪些输出:
The dates for 2013-W09 are 2013-02-25 through 2013-03-03
关于c++ - 如何获取特定年份中指定周数(1-53)的第一个和最后一个日期(日和月)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10672461/
我希望你能用一些代码来帮助我,它根据系统日期计算周数。 我有一个文本框 WeekNum ,我想显示 CommandButton1_Click 时的周数被激活。 我找到了有关如何从给定日期计算周数的文章
有没有一种好方法可以让年份+周数转换为R中的日期?我尝试了以下方法: > as.POSIXct("2008 41", format="%Y %U") [1] "2008-02-21 EST" > as
我有一个带有日期列的 mysql 表,我想以某种模式打印我的表,在同一列中,它应该将日期打印为日期(周号)或日期周号。 例如2014-06-05-第 22 周或 2014-06-05(第 22 周)。
我想以字符串格式从给定日期获取 ISO 周数,其中星期一是一周的第一天,包含一年中第一个星期四的那一周被认为是第一周。 从其他答案来看,我认为 strftime("2017-11-18", forma
我正在尝试创建一个脚本,该脚本在设定的时间段(上个月的 23 日和本月的 23 日)内获取工作日、日历日和工作日的计数。 我有以下脚本,我尝试使用 Worksheet Functions 但它不起作用
我确信我在这里忽略了一些非常基本的东西,但在查询和谷歌搜索大约一个小时后我无法理解它。 我已经有一个日期表了,如果有帮助的话。它填充了过去几年的日期,并通过服务器上的作业运行的存储过程每晚更新。 我需
如果在 MySQL 中只有星期几、周数、月份和年份,是否有某种方法可以获取日期? 例子: 我想知道这个参数是哪一天: 年份:2014 月份:9 月 (09) 一年中的周数:37 或 9 月的周数:3
我需要一个选择菜单(下拉菜单),其中周数为 1 到现在 + 10 周。所以我做了: week '.$x.'';
我有以下 Pandas 系列,想获得该日期的 GPS 周数: import pandas as pd from pandas import Timestamp times = pd.Series([T
我需要在我的自定义日历中设置事件,这些事件将根据选定的周期重复,即每天、每周、每月或每年。我有以毫秒为单位的开始和结束日期。 问题: 是否有任何日历或日期 API,我们可以从中计算两毫秒之间的天数、周
以下查询返回周号。 53,我认为 02-Jan-2017 是 2017 年第一周的开始。 SELECT TRUNC(CL_DT, 'IW') AS WK_STARTDATE, TRUNC
我有两个 datetime 对象;开始日期和结束日期。我需要枚举两者之间的天数、周数和月数,包括在内。 理想情况下,结果将采用 datetime 格式,但任何兼容的格式都可以。周和月由与周/月的第一天
我有一个简单的 SQL 用于计算 SQLite 报告中的周数 SELECT STRFTIME('%W', 'date_column') 2009-2012 年是正确的。在 2013 年,我总是得到错误
我有如下四个单元格,我想将它们组合在一个单元格中作为一个短日期: A1: Year A2: Month A3: Week number A4: Week day 现在我想要,Excel 查看上面的单元
如何确定 Windows 批处理文件中的 ( ISO 8601 ) 周数? 不幸的是WMIC PATH WIN32_LOCALTIME GET/FORMAT:LIST只有WeekInMonth...
我正在尝试从给定日期创建 N 周,并且周列表应排除属于该周的周。 例如,如果我给出今天的日期,那么我想生成排除本周的周数至 N 周。 下面是满足我的目的的示例,但我无法创建 N 周数,这段代码也打印当
我有一个 GPS 设备,可以将一些对象(包括 GPS 时间)发送到我的服务器。 它以周数的格式出现,秒到一周。 我想将其转换为日期时间格式。我为此找到了一些代码,但我发现的只是如何将周数转换为日期,不
我正在尝试编写一个函数来计算设备需要检查的下一个日期。我正在使用下面的代码(它不完整。) function get_next_check(){ $today = date(get_option
我有这样一个日期:171115 183130 (17-11-15 18:31:30)。我使用的 API 要求我根据周数提供日期,但由于它用于 GPS 服务,因此需要是从 1980 年(第一个纪元)开始
所以我正在为 Android 开发一个小的储蓄应用程序。我有三个我需要处理的值(value)观。我有每日储蓄金额的值(value),每月储蓄的值(value),以及年度储蓄的值(value)。然后我想
我是一名优秀的程序员,十分优秀!