我有一个奇怪的PHP问题和一个使用当前时间的C脚本.我的程序有点复杂,但问题缩小到这个:
我有这个C代码打印1分钟前的日期,当前日期和从现在开始1分钟的日期:
#include <time.h>
#include <stdio.h>
int main(int argc, char **argv){
char date[9];
time_t rawtime;
struct tm * ptm;
int i;
time(&rawtime);
ptm = gmtime(&rawtime);
ptm->tm_min--;
for(i = 0; i < 3; i++){
rawtime = mktime(ptm);
ptm = gmtime(&rawtime);
snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min);
printf("%s\n", date);
ptm->tm_min++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在shell中运行它时,我得到了正确的结果(打印格式是月份,小时,分钟):
$ ./test
17 20 7
17 20 8
17 20 9
Run Code Online (Sandbox Code Playgroud)
但是,当我通过PHP执行它时,我得到了奇怪的结果.这是PHP代码:
<?php
exec("path_to_exec/test", $output);
echo "$output[0]<br/>";
echo "$output[1]<br/>";
echo "$output[2]<br/>";
?>
Run Code Online (Sandbox Code Playgroud)
这是输出:
17 20 …Run Code Online (Sandbox Code Playgroud) 我想用我的简单程序做的是计算两个日期之间的秒差.
time_t referenceDate;
time_t dateNow = time(0);
struct tm referenceDateComponent = {0};
referenceDateComponent.tm_hour = 0;
referenceDateComponent.tm_min = 0;
referenceDateComponent.tm_sec = 0;
referenceDateComponent.tm_year = 89;
referenceDateComponent.tm_mon = 11;
referenceDateComponent.tm_mday = 31;
referenceDate = mktime(&referenceDateComponent);
long seconds = difftime(dateNow, referenceDate);
Run Code Online (Sandbox Code Playgroud)
Whit应用程序上面的代码工作正常,但如果尝试设置tm.year负数(在1900年之前构建日期)mktime()函数返回-1
我知道该time_t类型只管理从1970年1月1日UTC开始的日期,根据文档:
由于历史原因,它通常被实现为表示自UTC时间1970年1月1日00:00(即,unix时间戳)以来经过的秒数的整数值.尽管库可以使用替代时间表示来实现此类型.
我知道还有Boost库,但对我来说不是一个有用的解决方案.
所以我的问题是,从1970年以前的日期开始,有什么办法可以在几秒钟内获得变化?
我正在收集用户输入的“DD/MM/YYYY”
目的是以 csv YYYY,MM,DD 的形式传递到 mktime。
puts "Please enter dob in dd/mm/yyyy format;"
inp = gets.chomp
inp = inp.gsub(" ","")
while inp.length != 10
puts "Please use dd/mm/yyyy format"
inp = gets.chomp
end
bday = inp.gsub("/",",")
ctime = Time.new
btime = Time.mktime(bday)
lsecs = ctime - btime
ysecs = Time.mktime(2001) - Time.mktime(2000)
rsecs = 1000000000 - lsecs
ryears = rsecs / ysecs
puts "You are currently #{lsecs} seconds old"
puts "You have #{ryears} years until you are a billion seconds …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码在PST(又名America/Los_Angeles)时间生成昨天的开始.我无法弄清楚如何将结果转换为UTC.
date_default_timezone_set("America/Los_Angeles");
$time1 = date("Y-m-d H:i:s", mktime(0,0,0, date('n'), date('j')-1, date('Y')));
Run Code Online (Sandbox Code Playgroud)
我试过这个,但$ time1不是datetime,它是字符串.所以以下方法不起作用.
$time1->setTimezone(new DateTimeZone("UTC"));
Run Code Online (Sandbox Code Playgroud) 我想看看 1970 年 1 月 1 日的 00:00:00 是否实际上对应于 0 秒,我写了以下内容:
#include <stdio.h>
#include <time.h>
int main(void) {
int year = 1970;
struct tm t = {0};
t.tm_mday = 1; // January
t.tm_year = year - 1900;
t.tm_hour = 0;
t.tm_isdst = -1;
printf("%ld\n", mktime(&t));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给我的值为-3600。我哪里错了?
PS:使用 GCC v.10.1 进行测试。我尝试在另一个架构下使用另一个编译器,它给了我正确的值。
我正试图将2010-02转换为2010年2月.但是,我一直持续到1969年12月
我尝试过使用mktime,strtotime和两者的某种组合,但仍然无法做到......
这是我最近尝试过的......
$path_title = date('F, Y', mktime(0,0,0,2,0,2010));
Run Code Online (Sandbox Code Playgroud) 是否有更快捷的方法来创建日期,例如:
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")+3, date("Y")));
Run Code Online (Sandbox Code Playgroud)
谢谢,如果你能提供帮助.
我需要帮助以下列格式获取前几个月的完整日期范围:Ymd
我已经成功地获得了"这个"月份的完整日期范围,但没有达到"前一个"月份的完整日期范围.
任何帮助是极大的赞赏!
我目前正面临一个需要尽快解决的问题.
我试图通过使用以下代码列出当前年度(2012年)的所有月份:
for ($m=1; $m<=12; $m++) {
$month = date('F', mktime(0,0,0,$m));
echo $month. '<br>';
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下意外的输出:
1月3月3月5月5月7月7月8月10月10月12月12月
我做错了什么,请帮忙!
我正在研究一些与时间相关的功能,我选择始终使用UTC时间并将时间戳存储为整数以保持一致性.
但是,我注意到当我使用mktime它时,似乎当前设置的时区会影响返回值mktime.从我理解的文档中,mktime应该返回自epoch以来的秒数:
返回与给定参数对应的Unix时间戳.此时间戳是一个长整数,包含Unix Epoch(1970年1月1日00:00:00 GMT)与指定时间之间的秒数.
http://php.net/manual/en/function.mktime.php
但是,似乎mktime包括当前设置的时区.使用以下代码时:
date_default_timezone_set('UTC');
$time = mktime(0, 0, 0, 1, 1, 2016 );
echo "{$time}\n";
date_default_timezone_set('Australia/Sydney');
$time = mktime(0, 0, 0, 1, 1, 2016 );
echo "{$time}\n";
Run Code Online (Sandbox Code Playgroud)
我希望这两个时间值相同,但显然它们不是:
1451606400
1451566800
Run Code Online (Sandbox Code Playgroud)
这似乎是一个11小时的差异:
1451606400 - 1451566800 = 39600 / (60*60) = 11
Run Code Online (Sandbox Code Playgroud)
我在使用时没有正确理解mktime和/或为什么要考虑时区mktime?