- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚开始学习 C++。
我使用的是带有 Visual Studio 版本的 Windows 7 Ultimate x64:
Microsoft Visual Studio Enterprise 2017
Version 15.9.12
VisualStudio.15.Release/15.9.12+28307.665
Installed Version: Enterprise
Visual C++ 2017 00369-90013-89248-AA631
Microsoft Visual C++ 2017
Visual Studio Tools for CMake 1.0
Visual Studio Tools for CMake
我正在尝试比较这两个日期:
1582 October 15
2009 June 19 18:00
因为我想知道一个日期是否晚于 1582 年 10 月 15 日。
为此,我有这段代码:
#include <ctime>
tm date = { 0, 0, 18, 19, 5, 109, 0, 0, 0 };
tm gregorian = { 0, 0, 0, 15, 9, (1582 - 1900), 0, 0, 0};
double aux = std::difftime(std::mktime(&date), std::mktime(&gregorian));
但是 aux
等于 0.0
。我认为它一定不为零。
是我做错了什么还是结果是正确的?
最佳答案
一旦您使用旧 日期,您应该小心使用您使用的日期和时间函数。 年长 可能在前一天开始 1970-01-01 .如果你回到 1582-10-15,那是 Gregorian calendar 的生效,则需要格外小心。
在您的代码中,mktime()
将日期转换为 time_t
,然后您可以使用它来区分两个日期。根据 C 标准:
The range and precision of times representable in
clock_t
andtime_t
are implementation-defined.
通常,time_t以自 1970-01-01 以来经过的秒数表示。这需要知道(或假设)日期和时间的时区(默认为 0:00:00),并且不仅要完美理解闰年,还要完美理解 leap seconds。 .
mktime()
如果日期无效或无法在实现支持的 time_t 范围内转换,则返回错误代码 -1。因此,您的代码的更安全版本将检查潜在错误:
std::time_t th = std::mktime(&date);
std::time_t tl = std::mktime(&gregorian);
if (th==-1 || tl==-1) {
std::cout<<"At least one of the date couldn't be converted"<<std::endl;
}
else {
double aux = std::difftime(th, tl);
std::cout << aux<< " "<< aux/3600.0/24.0/365.25 <<std::endl;
}
Online demo有一个运行良好的实现。对于 MSVC,转换对于 1970-01-01 之前的任何日期都会失败。已记录 here .
现在,如果您回到 1582-10-15,将其转换为用于比较两个旧日期的精确秒数没有多大意义。
因此,您可能需要考虑 boost::gregorian::date
.该库能够处理从 1400-Jan-01 到 9999-Dec-31 的日期。它将日期转换为天数,而不是转换为秒数。
然后您可以通过获取天数差异来可靠地比较日期,例如 1582-10-15 和 1582-10-14:
using namespace boost::gregorian;
date d0(1582, 10, 15);
date d1(1582, 10, 25);
date d2(1582, 10, 14);
std::cout << d1-d0 << std::endl;
std::cout << d2-d0 << std::endl;
有趣的是,在上面的示例中,您会看到 BOOST 会进行理论计算。它将发现 1582-10-14 和 1582-10-15 ( demo ) 之间存在一天的差异。
当然,我们都知道这是荒谬的,因为introduction of the Gregorian calendar导致 1582 年 10 月 4 日紧随其后的是第二天的 1582 年 10 月 15 日。
另请注意,其他日期也存在此类日历不一致的情况,具体取决于国家/地区。以英国为例,根据维基百科,1752 年 9 月 2 日星期三之后是 1752 年 9 月 14 日星期四。
最后,如果您比较公历之前的日期,您需要接受歧义。以 1492 年 10 月 12 日为例,即哥伦布踏足美洲的那一天。它实际上是儒略历中的一个日期。在公历it would in reality be 21 October 1492 .
现在,time_t
有点遗留了。 C++标准指的是相关函数定义的C标准。
现代 C++ 提供 std::chrono
和 std::chrono::time_point
类型。问题是目前没有可用的函数来转换日历和从日历转换:这些只会随 C++20 一起提供。
但如果您只想比较两个旧日期,假设没有日历不一致,您可以只比较年份,如果相等,则比较月份,如果相等,则比较日期。我知道这听起来很荒谬,但无论您的 C++ 版本和实现是什么,这都可以毫无问题地工作。
关于c++ - 如何比较两个 tm(来自 ctime)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58683730/
我偶然发现了这种行为,想知道这是否符合预期(我觉得不对)。 我在一个特定的 tm 结构中强加了一个错误,所有其他的都被破坏了。 这是代码(精简到最低限度以重现问题) int main() {
我使用 tm.plugin.tags 进行情绪分析: pos=sapply(search.corpus,tm_tag_score,tm_get_tags("Positiv")) neg=sapply(
这个问题已经困扰我好一分钟了。我正在开发一个用 C++ 编写的程序,我需要能够在两个不同的服务器之间发送以 ISO8601 编码的时间。这里的主要坚持者似乎是 Windows。 到目前为止,我已经从
namespace abc{ class MyClass{ protected: tm structTime; public: const tm&
我正在使用tm包对修复数据进行文本分析,将数据读取到数据框中,转换为Corpus对象,并应用了各种方法来使用Lower,stipWhitespace,removestopwords等清除数据。 取回C
我最近一直在尝试使用 tm 包在 R 中的 data.frame 中的单个列中查找词频。虽然 data.frame 本身有许多基于数字和字符的列,但我只对一个纯文本列感兴趣。虽然我在清理文本本身时没有
我正在尝试使用 tm 包对俄语文本进行一些文本挖掘,但遇到了一些问题。 预处理速度很大程度上取决于编码。 library(tm) rus_txt<-paste(readLines('http://li
我有一个 URL 列表,我已为其获取 web 内容,并将其包含到 tm 语料库中: library(tm) library(XML) link <- c( "http://www.r-statisti
我正在尝试清理语料库,并且使用了典型步骤,如下面的代码: docs?@[\\\]^_ {|}~`。要删除其他符号,例如打印引号或项目符号(或任何其他符号),请声明您自己的转换函数: removeSpe
我试图从我构建的语料库中删除一些单词,但它似乎不起作用。我首先遍历所有内容并创建一个数据框,按照频率顺序列出我的单词。我使用此列表来识别我不感兴趣的单词,然后尝试创建一个删除单词的新列表。但是,这些词
我正在尝试突出显示 PDF 文档中的文本,但我发现了一个带有以下操作数的 Tm 运算符: 0 7.98 -7.98 0 90.8898 715.4183 Tm Tm 运算符应该仅在其操作数上替换文本矩
高性能任务 View 指出 tm可以使用 snow 进行并行文本挖掘 (High-Performance and Parallel Computing with R)。然而,我没有找到任何例子来说明如
如果我这样做的话,我对如何使用 tm 结构对象有点困惑; printf("The current date is %d-%d-%d\n", now.tm_mon, now.tm_mday, now.t
glibc 版本的 struct tm 有额外的字段 long tm_gmtoff; /* Seconds east of UTC */ const char *tm_zone;
我想在格式结构“tm”中添加秒延迟,所以我运行这段代码: #include #include #include #include #define SEC_PER_DAY 86400 #define S
我有以下带有几个选项的简单选择标签,我想在标题上方的选项值中添加商标 (TM),但是 标签没有改变任何东西。 在选项的上方位置显示 TM 的其他方法是什么? Option Value TM
标准 C/C++ 库中是否有可填充 struct tm 的内容? 更具体地说明我的问题:我希望能够提供一个日期并从中填充 struct tm(例如:1-1-2000 00:00:01。)对于大多数字段
我想将 tm 结构用作类中的静态变量。花了一整天的时间阅读和尝试,但仍然无法正常工作:(如果有人能指出我做错了什么,我将不胜感激 在我的类里面,在 Public 下,我将其声明为: static st
你能举一个使用 tm 的例子吗(我不知道如何初始化那个 struct),当前日期是以这种格式写的 年/月/日? 最佳答案 如何使用tm结构 调用 time() 以获取当前日期/时间(自 1970 年
我有一个字符串,其中包含自纪元以来的微秒数。如何将其转换为时间结构? #include #include #include int main () { struct tm tm;
我是一名优秀的程序员,十分优秀!