- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您能否提供在 boost 1.55 中使用 boost::locale::date_time
时遇到的陷阱,或者告诉我我在以下示例中犯了什么错误?我是否误解了 boost::locale::date_time
API?
#include <iostream>
#include <boost/locale.hpp>
int main() {
using namespace boost::locale;
generator gen;
std::locale locale = gen("en_US.UTF-8");
std::locale::global(locale);
std::cout.imbue(locale);
date_time_period_set s;
s.add(period::year(2013));
s.add(period::month(2));
s.add(period::day(5));
s.add(period::hour(9));
s.add(period::minute(0));
s.add(period::second(0));
// 2013-03-05 is a Tuesday, let's shift it to a Sunday
s.add(period::day_of_week(1));
date_time now(s);// why it's not 2013-03-02 or 2013-03-10?
std::cout << now << std::endl;
}
输出:Mar 30, 2014, 9:00:00 AM
,为什么不是 2013-03-02, 9:00:00 AM
或 2013-03-10,上午 9:00:00
?这甚至不是星期天。
#include <iostream>
#include <boost/locale.hpp>
int main() {
using namespace boost::locale;
generator gen;
std::locale locale = gen("en_US.UTF-8");
std::locale::global(locale);
std::cout.imbue(locale);
date_time_period_set s;
s.add(period::year(2013));
s.add(period::month(2));
s.add(period::hour(9));
s.add(period::minute(0));
s.add(period::second(0));
// swapping the following 2 lines rusults in a wrong date
s.add(period::day_of_week(7));
s.add(period::day_of_week_in_month(-1));
date_time now(s);// last Saturday of March 2013
std::cout << now << std::endl;
}
它输出:Mar 30, 2013, 9:00:00 AM
但如果您更改源代码中标记的 2 行,您可能会看到:Apr 5, 2014, 9:00:00 AM
date_time_period boost::locale::period::first_day_of_week(int v)
?参见 date_time_period boost::locale::period::first_day_of_week(int v) .
最佳答案
这不是这个问题的答案。我不太精通 boost::locale::date_time
。然而,无论如何我都会用一个可能的替代方案来回应。这种替代方法不像 boost::date_time
那样包装得很好,也没有那么完整,尤其是在语言环境方面。然而,它对您来说可能是一个可行的替代方案,因为您的需求看起来很简单,而这个替代方案非常简单。
我说的是:
chrono-Compatible Low-Level Date Algorithms
这不过是一篇论文,概述了日期(而非时间)计算的 10 个非常低级的构建 block ,例如您问题中的那些。上述论文没有提供您可以下载的库。相反,它只是列出并解释了 10 种算法。每个算法的代码都很短,复制/粘贴到您自己的代码中并根据您的特定需求进行修改非常实用。该代码属于公共(public)领域,因此无需担心版权问题。
本文使用 10 种算法中的 5 种,结合以下用于输出日期的样板(我使用 std::tuple
来保存日期,使用任何你想要的就像),我已经为您的简单问题提出了非常简单的解决方案:
// here is my copy of the 10 algorithms
#include "../date_performance/date_algorithms"
#include <string>
#include <iostream>
// I'm being lazy in defining my date class
using date = std::tuple<int, unsigned, unsigned>;
// I'm being lazy in defining I/O for my date class
std::string
to_string(date const& d)
{
int year;
unsigned month;
unsigned day;
std::tie(year, month, day) = d;
std::string r = std::to_string(year) + '-';
if (month < 10)
r += '0';
r += std::to_string(month) + '-';
if (day < 10)
r += '0';
r += std::to_string(day);
return r;
}
下面是我将如何构造一个日期,例如 2013 年 3 月 5 日:
date d(2013, 3, 5);
为了找到这个日期或之前的星期日,我首先需要找出这个日期是星期几。这是一个使用这些低级构建 block 的两步过程:
这是通过以下方式完成的:
int s = days_from_civil(std::get<0>(d), std::get<1>(d), std::get<2>(d));
unsigned wd = weekday_from_days(s);
或者如果你愿意:
int s = days_from_civil(2013, 3, 5);
unsigned wd = weekday_from_days(s);
接下来,为一周中的每一天命名常量是个好习惯。此代码遵循 C 和 C++ 约定,例如:
constexpr unsigned sun = 0;
现在是星期日的前一天是序列日期,减去这个工作日过去星期天的天数(如果这是星期日,则可能为 0,如果这个工作日是星期日,则可能为 6周六):
date d1 = civil_from_days(s - weekday_difference(wd, sun));
当我打印出来时:
std::cout << "The Sunday before was " << to_string(d1) << '\n';
我得到:
The Sunday before was 2013-03-03
这是解决您的第一个问题的非常少的代码。相反,如果您想要 2013 年 3 月 5 日之后的星期日,那同样简单:
date d2 = civil_from_days(s + weekday_difference(sun, wd));
std::cout << "The Sunday after was " << to_string(d2) << '\n';
哪些输出:
The Sunday after was 2013-03-10
您可以轻松地使用这些低级算法来编写您自己的高级算法来计算您想要的内容。
您需要做的第一件事是找到今年该月的最后一天:
unsigned last = last_day_of_month(2013, 3);
在这个例子中我们都知道这等同于:
unsigned last = 31;
但是如果年份和月份是运行时值,last_day_of_month
就派上用场了。现在我们需要这个月最后一天的工作日。和以前一样:
unsigned wd_last = weekday_from_days(days_from_civil(2013, 3, last));
现在我们只需要从 last
中减去最后一个工作日距星期六的天数。假设我们已经设置了一个信息常量 (sat == 6
),这看起来像:
unsigned day = last - weekday_difference(wd_last, sat);
day
是 2013 年 3 月的最后一个星期六所在月份的第几天。我们可以将其打印出来:
std::cout << "The last Saturday of March 2013 was " << to_string(date(2013, 3, day)) << '\n';
并得到:
The last Saturday of March 2013 was 2013-03-30
再说一次,您可以轻松地将所有这些封装在一个简洁的函数中。事实上,the paper甚至还有这样一个示例函数。
如果这些低级日期算法对您或任何其他读者有帮助,那就太好了,否则不要紧。 :-)
关于c++ - boost::locale::date_time 的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22813668/
正如问题所说,C++ 程序员在转向 Java 时面临哪些常见/主要问题?我正在寻找一些广泛的主题名称或示例以及工程师必须进行的日常调整。然后我可以去深入阅读这个。 我对多年来使用 C++ 并不得不使用
我们正在准备发布一个在过去一年中一直在开发的大型网络应用程序。我们即将开始集成 ActiveMerchant 的过程,以处理该服务的经常性订阅费用。 我正在寻找关于考虑到我们的要求(如下所列)的最佳实
您陷入过哪些 Powershell 陷阱? :-) 我的是: # ----------------------------------- function foo() { @("text")
对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗。而在MySQL方向上,升级这件事情就被淡化了许多,好像只能证明它的
Android 新增了 AsyncLayoutInflater类到他们的支持库版本 24.0 和更高版本,并且可以在 Android SDK 4.0 或更高版本(几乎所有可用的设备)中使用。 根据 A
作为一名刚接触 Vala 的程序员,您对刚接触该语言的人的第一条建议是什么? 最佳答案 这很大程度上取决于您的背景。如果您来自 C/C++/Java,最好的建议是学习函数式编程。 Vala 支持真正的
作为 Spring 世界的新手,我认为如果有一个社区 Wiki 页面列出基于 Spring 的项目中常见的陷阱会很好。 这些包括: 被误解的概念 在 Spring 3.X 中不再推荐的 Spring
我正在开发一个脚本来管理一些陷阱。一开始我只用这段代码管理 INT 和 SIGTSTP,它工作得很好: #!/bin/bash function capture_traps() { echo
bash 中是否可以在函数退出时调用某些命令。我的意思是: function foo { # something like this maybe? trap "echo \"exit
我们在我们的域中托管了一个应用程序。所有用户都需要先通过 POST 表单登录。登录后,表单会自动重定向到我们网站上的仪表板页面。 是否可以允许一些客户托管他们自己的登录表单(在他们的网站上),然后发布
我有一个无窗口计时器(没有 WM_TIMER),它只在给定的时间段过去后触发一次回调函数。它作为 SetTimer()/KillTimer() 实现。时间段足够小:100-300 毫秒。 对于每个如此
我使用 Java 大约一个月了,总体而言仍然是编程方面的业余爱好者,所以如果我有什么不对的地方,请随时纠正我。也许我会提供一些多余的细节,但我现在很困惑,无法决定什么才是重要的。 因此,我一直在开发多
我正在开发一个需要使用 FileSystemWatcher 类的 C# 程序,以便在创建新文件时通知它。作为初始化的一部分,程序会扫描目录,以便处理其中已存在的任何文件。一切正常。 但是,在与另一位开
下面材料整理自Internet&著作。 STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list
我正在使用 NuGet 包 Polly实现捕获故障转移 SQL 异常的重试逻辑。我在 Azure 中设置了 SQL Server Always On 高可用性。 我不想捕获所有 SQL 异常(这是不正
在编写 Scala RemoteActor 代码时,我注意到了一些陷阱: 必须设置 RemoteActor.classLoader = getClass().getClassLoader() 以避免“
出于某种原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常。我基于我在网上找到的示例中的代码,但它似乎对我不起作用。 我将不胜感激有关如何解决此问题的任何提示或指示。 注意:在下面的例子中
我正在尝试从 R 调用 winBUGS 来估计逻辑回归。我正在使用以下代码: # Directorio de trabajo setwd("~/3 Diplomado/7 Bayesiana/8t1"
我正在尝试从 R 调用 winBUGS 来估计逻辑回归。我正在使用以下代码: # Directorio de trabajo setwd("~/3 Diplomado/7 Bayesiana/8t1"
我正在使用 ctypes 包装一个大型 C 库。 ctypesgen生成了包装代码(与我自己的做法相差不远)。作为包装 C 结构的 ctypes 的一部分,它们被制作为对象,其中一些在 C 中具有“s
我是一名优秀的程序员,十分优秀!