PHP Conference Japan 2024

unixtojd

(PHP 4, PHP 5, PHP 7, PHP 8)

unixtojd将 Unix 时间戳转换为儒略日

描述

unixtojd(?int $timestamp = null): int|false

返回 Unix timestamp(自 1970 年 1 月 1 日以来的秒数)的儒略日,或者如果没有给出 timestamp 则返回当前日的儒略日。无论哪种方式,时间都视为本地时间(而不是 UTC)。

参数

timestamp

要转换的 Unix 时间戳。

返回值

一个整数形式的儒略日编号,或者在失败时返回 false

变更日志

版本 描述
8.0.0 timestamp 现在可以为 null。

参见

  • jdtounix() - 将儒略日转换为 Unix 时间戳

添加注释

用户贡献的注释 6 条注释

2
fabio at llgp dot org
18 年前
如果您需要一种简单的方法将 Unix 时间戳转换为十进制儒略日,您可以使用

$julianDay = $unixTimeStamp / 86400 + 2440587.5;

86400 是一天中的秒数;
2440587.5 是 1970 年 1 月 1 日 0:00 UTC 的儒略日。
1
匿名
18 年前
很明显,此函数返回儒略日,而不是儒略日 + 时间。

如果您希望包含时间,则需要执行以下操作

$t=time();
$jd=unixtojd($t)+($t%60*60*24)/60*60*24;
0
unixtojd at isslow dot com
9 个月前
unixtojd 速度很慢。
直接算术计算更快,并且仍然与原始 unixtojd 保持一致。

可以随意添加对 $timestamp 的测试,当 $timestamp 为 null 时将其设置为 time()。

function fast_unixtojd($timestamp){
return intval($timestamp / 86400 + 2440588);
}

$time = time();
$t_unixtojd = 0;
$t_fast_unixtojd = 0;
for ($t = $time - 240 * 3600; $t < $time; $t++) {
$time1 = microtime(true);
$a = unixtojd($t);
$time2 = microtime(true);
$b = fast_unixtojd($t);
$time3 = microtime(true);
if ($a != $b) {
echo "$a $b $t\n";
break;
}
$t_unixtojd += $time2 - $time1;
$t_fast_unixtojd += $time3 - $time2;
}
echo "unixtojd: $t_unixtojd sec\nfast_unixtojd: $t_fast_unixtojd sec\n";

unixtojd: 0.42854166030884 sec
fast_unixtojd: 0.13218021392822 sec
0
hrabi at linuxwaves dot com
17 年前
根据 http://www.decimaltime.hynes.net/dates.html#jd 和阅读此处的“X. 日历函数”,似乎 php“jd”的确表示“纪年儒略日”(是否应该命名为 cjd,并且主要严格提及 - 不是吗?),用于日历系统之间的转换。那么就可以了(但我不认为不完整的说明书在这里具有强烈的迷惑性)。
即使这样,cJD 也调整到本地时间,所以……我现在有点糊涂了,所以没有其他了 :-)。
0
hrabi at linuxwaves dot com
17 年前
这不可用。儒略日从中午开始,而不是午夜。最好使用 Fabio 的解决方案(但是闰秒存在潜伏问题)。

<?php
function mmd($txt, $str_time) {
$t = strtotime($str_time);
$j = unixtojd($t);
$s = gmstrftime('%D %T %Z', $t);
$j_fabio = $t / 86400 + 2440587.5;

printf("${txt} => (%s) %s, %s U, %s J, or %s J<br>\n", $str_time, $s, $t, $j, $j_fabio);
}

//$xt = strtotime("1.1.1970 15:00.00 GMT");
$sam = "9.10.1995 02:00.01 GMT";
$spm = "9.10.1995 22:00.01 GMT";

// unixtojd for $spm returns 2450000 (OK), but for $sam returns 2450000 too! (it is wrong).
mmd("am", $sam); // should be 2449999 (+ 0.58334)
mmd("pm", $spm); // should be 2450000 (+ 0.41668)
?>

参考
Unix 时间、UTC、TAI、NTP……问题: http://en.wikipedia.org/wiki/Unix_time
儒略日转换器: http://aa.usno.navy.mil/data/docs/JulianDate.html
历史概述: http://parris.josh.com.au/humour/work/17Nov1858.shtml
0
johnston at capsaicin dot ca
21 年前
还要注意,纪元时间为 UTC 时间(纪元时间是时间中的一个特定点 - 每个时区的纪元时间并不不同),因此请注意时区的复杂性。
To Top