我读了两个字符串,包括年份,朱利安日(年),小时,分钟和观察.
我使用sscanf将相关变量拉出来:
sscanf(tide_str1.c_str(), "%d %d %d %d %Lf", &y1, &j1, &h1, &m1, &obs1);
sscanf(tide_str2.c_str(), "%d %d %d %d %Lf", &y2, &j2, &h2, &m2, &obs2);
Run Code Online (Sandbox Code Playgroud)
对于此特定数据集,值为2011 083 23 22 1.1
然后我创建并填充一个tm结构,运行mktime,在两天之间的cout调用,它从083变为364.
int y1=2011, j1=83, h1=23, m1=22;
struct tm time_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0}, *time_ptr = &time_struct;
time_t tv_min;
time_struct.tm_year = y1 - 1900;
time_struct.tm_yday = j1;
cout << time_struct.tm_yday << endl;
time_struct.tm_hour = h1;
time_struct.tm_min = m1;
time_struct.tm_isdst = -1;
cout << time_struct.tm_yday << endl;
tv_min = mktime(time_ptr);
cout << time_struct.tm_yday << endl;
Run Code Online (Sandbox Code Playgroud)
这是为什么?是因为tm_mday和tm_mon设置为0?我最初尝试不将它全部初始化为零,但随后mktime返回-1.如果我只知道年份而不是月份和月份,我应该做些什么呢?
Kei*_*son 17
mktime() 正在做它应该做的事情.
引用C标准:
的mktime函数将破碎下降时间,表示为本地时间,在该结构指向timeptr与相同的编码与由返回的值的日历时间值的时间的功能.忽略结构的tm_wday和 tm_yday组件的原始值,并且其他组件的原始值不限于上面指出的范围.成功完成后,将适当地设置结构的tm_wday和tm_yday组件的值 ,并将其他组件设置为表示指定的日历时间,但将其值强制为上述范围; 在确定tm_mon 和tm_year之前,tm_mday的最终值未设置.
mktime()可以计算的值tm_mday和tm_yday从其他成员; 它不是为了计算这些字段中其他成员的值而设计的.
但是,您可以执行的操作是struct tm使用超出范围的值初始化a .例如,如果您想要tm_yday为200(一年中的第200天),则可以初始化struct tm代表1月200日的代码. mktime()然后将其标准化为正确的日期,产生一个time_t值,然后您可以输入gmtime()或localtime().
这是一个简单的例子:
#include <iostream>
#include <ctime>
int main()
{
struct tm t = { 0 };
t.tm_sec = t.tm_min = t.tm_hour = 0; // midnight
t.tm_mon = 0; // January
t.tm_year = 2012 - 1900;
t.tm_isdst = -1; // unknown
t.tm_mday = 200; // January 200th?
time_t when = mktime(&t);
const struct tm *norm = localtime(&when); // Normalized time
std::cout << "month=" << norm->tm_mon << ", day=" << norm->tm_mday << "\n";
std::cout << "The 200th day of 2012 starts " << asctime(norm);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
month=6, day=18
The 200th day of 2012 starts Wed Jul 18 00:00:00 2012
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13361 次 |
| 最近记录: |