已经写好了,和我想象的差了1秒... 有错误请指正一下w
<?php
date_default_timezone_set('UTC');
function years_to_seconds($year) {
$s=0;
for ($i=0;$i<$year;$i++) {
if (($i % 100 == 0 && ($i % 400 == 0 && $i % 3200 != 0)) || ($i % 4 == 0 && $i % 100 != 0)) {
$s += 31622400;
} else {
$s += 31536000;
}
}
return $s;
}
$seconds=years_to_seconds(1969) + strtotime('2016-01-01 00:00:00');
echo $seconds;
?>
function years_to_seconds($year) {
$s=0;
for ($i=1;$i<$year;$i++) {
if (($i % 100 == 0 && ($i % 400 == 0 && $i % 3200 != 0)) || ($i % 4 == 0 && $i % 100 != 0)) {
$s += 31622400;
} else {
$s += 31536000;
}
}
return $s;
}
改了下函数,这段函数和
function years_to_seconds($year) {
return 31536000*($year-1)+(floor($year/4)-floor($year/100)+floor($year/400)-floor($year/3200))*86400;
}
相等
1
ovear 2017-08-13 01:44:36 +08:00 1
|
2
xfspace 2017-08-13 01:45:16 +08:00 via Android
timestamp
|
8
ovear 2017-08-13 01:52:37 +08:00
润秒要考虑进去的话,就百度加了几次闰秒
|
11
lsylsy2 2017-08-13 02:24:10 +08:00
|
12
lsylsy2 2017-08-13 02:30:47 +08:00
另外 unix 时间戳是没有考虑闰秒的。然后你往前推到人类还没有定义闰秒的年代……
所以获取“从历法的 0001 年以来经过的,2017 年物理学定义中的秒数”,误差可能是天级别( 24*60*60 秒)的; 以我的知识估算了一下,准确到小时问题不大(将历史上的所有修改历法考虑进去,算出一个 0001 年到 1970 年的秒数,然后加上 unix 时间戳) 极限可能是几十几百秒吧(两千年间人类没能观测到的闰秒累计起来) |
14
chairuosen 2017-08-13 02:36:43 +08:00
别说闰秒,连小时,分钟也许都没有。你无法定义“ 0001 年 1 月 1 日 00:00:00 ”是哪一刻,所以无法得出结果。
|
15
msg7086 2017-08-13 04:28:48 +08:00 1
@lslqtz 首先你这是从 0 年开始算的吧。第一年是 1 年哦,循环应该是从 1 到 year 吧。
而且,这代码还用循环? function y($year) { $secs = 31536000 * $year; $leapdays = floor($year / 4) - floor($year / 100) + floor($year / 400) - floor($year / 3200); return $secs + $leapdays * 86400; } y(1969) # => 62135596800 |
18
konakona 2017-08-13 04:44:06 +08:00
@chairuosen 公元 1 年?
|
19
konakona 2017-08-13 04:44:36 +08:00
公元 1 年,属公元 1 世纪 00 年代。中国为辛酉年(鸡年),汉平帝元始元年。
|
20
lslqtz OP 去掉我上面那句话...
大概得修,不过实际得出的结果影响 |
22
Valyrian 2017-08-13 05:01:14 +08:00 via iPad
两个时间戳减一下不就行了吗???
|
24
lzhr 2017-08-13 05:03:36 +08:00
SECONDS_PER_DAY, 86400
DAYS_FROM_0_TO_1970, 719528 好像没有零年 |
25
lslqtz OP 重新改了下函数,在 C#中得出的结果和 PHP 中 strtotime 里面的结果完全一样。
我在 C#中用这段代码来测... Console.WriteLine(new DateTime(633979008000000000, DateTimeKind.Utc)); 在 PHP 中用这段代码来生成... <?php date_default_timezone_set('UTC'); function years_to_seconds($year) { return 31536000*($year-1)+(floor($year/4)-floor($year/100)+floor($year/400)-floor($year/3200))*86400; } $seconds=years_to_seconds(1970) + strtotime('2010-01-01 00:00:00'); $seconds*=10000000; echo number_format($seconds,0,'',''); ?> |
26
chenqh 2017-08-13 05:17:48 +08:00 via iPhone
用现在的时间戳减去 01 年的时间戳不就好了吗
|
27
chenqh 2017-08-13 05:19:17 +08:00 via iPhone
看错了忽略我吧
|
28
msg7086 2017-08-13 05:37:50 +08:00 1
|
30
suman 2017-08-13 07:33:29 +08:00
1582 年 10 月 5 日~14 日是不存在的,楼主记得排除掉。
|
31
GreatHumorist 2017-08-13 07:40:55 +08:00 via iPhone
把 1970 年前的算出来做成常数,每次加时间戳不就行了?复杂度 O(1)
|
33
mrcn 2017-08-13 11:14:23 +08:00 via Android
0001 年到 1970 年的秒数是固定的对吧,然后再加上时间戳呢。
|
35
lslqtz OP @GreatHumorist 按这么说 性能还真不重要…
|
36
geelaw 2017-08-13 16:53:19 +08:00
这楼里面怎么这么多发明历法的?
不要尝试这种无意义的问题 |