- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我现在正在使用 gcc 编译器在我的 RedHat Linux 机器上编写一个 C 程序,它将接受两个日期作为输入并计算它们之间的差异。
但是,我发现 mktime()
有一个奇怪的行为,如下面的代码段所示。
struct tm t;
t.tm_year=4;
t.tm_mon=9;
t.tm_mday=30;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=0;
printf("%d-%d-%d %d:%d:%d\n", t.tm_year, t.tm_mon, t.tm_day, t.tm_hour, t.tm_min, t.tm_sec);
//result: 4-9-30 0:0:0, which means 1904 Oct 30 00:00:00
mktime(&t);
printf("%d-%d-%d %d:%d:%d\n", t.tm_year, t.tm_mon, t.tm_day, t.tm_hour, t.tm_min, t.tm_sec);
//result: 4-9-29 23:36:36, which means 1904 Oct 29 23:36:36
如您所见,struct tm
在 mktime()
之后移动,这看起来不合理。
我做了很多测试,我发现这种奇怪的行为只发生在 1904 年 10 月 30 日 00:00:00 - 00:23:24 之间的日期分配中。
此外,我在我的 unix 服务器 (HP-UX) 上测试了相同的代码,它运行完美,没有任何偏移。
不知道有没有人有过类似的经历,有没有人可以给我提示一下是怎么回事?
我在香港时区运行。
最佳答案
mktime()
函数假定输入代表本地 时间。在不同时间的不同地点,本地时间出现了许多奇怪的变化。
了解您所在的时区会很有帮助。如果您将时区设置为 UTC,我怀疑问题会消失。
我自己没有看到这个问题(我在太平洋夏令时,UTC 以西 7 小时)。
这看起来类似于同年 6 月在卢森堡发生的时移,记录在案 here , 当本地时钟向前移动 35 分 24 秒时。 1904 年 10 月 30 日是星期日,很可能是发生这种转变的时间。
另见 this question关于 1927 年上海的时间变化(恰好有 Jon Skeet 得分最高的答案)。
更新:找到了,感谢 Frxstrem 的评论。 1904 年 10 月 30 日,香港时间由 LMT 改为 HKT。如果 (a) 您的时区设置为香港时间,并且 (b) 您系统的时区库足够详细以反射(reflect)此特定更改,我预计会出现此症状。
http://www.timeanddate.com/time/change/hong-kong/hong-kong?year=1904
这是您的程序的修改版本,可以更清楚地显示问题:
#include <time.h>
#include <stdio.h>
int main(void) {
struct tm t = {
.tm_year = 4,
.tm_mon = 9,
.tm_mday = 30,
.tm_hour = 0,
.tm_min = 0,
.tm_sec = 0,
.tm_isdst = -1, /* let mktime() figure it out */
};
printf("%04d-%02d-%02d %02d:%02d:%02d\n",
1900+t.tm_year, 1+t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
// output: 1904-10-30 00:00:00
mktime(&t);
printf("%04d-%02d-%02d %02d:%02d:%02d\n",
1900+t.tm_year, 1+t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
// output: 1904-10-29 23:36:42
}
它为 tm_isdst
成员分配了一个值,而您的成员没有这样做;使用未初始化的值,您可能会有不可预知的行为。此外,您的程序将 tm_mday
拼错为 tm_day
。
这是我系统上的输出:
$ ./c
1904-10-30 00:00:00
1904-10-30 00:00:00
$ TZ=Asia/Hong_Kong ./c
1904-10-30 00:00:00
1904-10-29 23:36:42
$
关于我如何能够相当快地解决这个问题的一些背景知识(这可能对其他看到类似症状的人有所帮助):
这个问题让我想起了this one ,我熟悉它只是因为它有 highest-scoring answer通过highest-scoring user在堆栈溢出上。那是纯粹的运气。
因为我最初不知道时区,所以谷歌搜索“1904 time change”出现了 this page同年在卢森堡讨论类似的时间变化。世界其他地区可能在同一时间发生了类似的变化,这可能是向现代标准时区过渡的一部分。
Frxstrem 的评论一针见血:Google 搜索“1904 年香港时间变更”找到了 this page .
关于c - mktime() 奇怪地改变了日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24962380/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!