-3

谁能告诉我这个 635151121709530000 是什么时间格式以及如何转换,结果类似于 2013-9-18 14:42:50

谢谢

4

2 回答 2

1

此处信息不足,无法将您的电话号码转换为时间。 至少有两种常用的方式来表示一个时间点:

  • 第一个(也是最常见的)是数字表示时间戳表示的时间和某个“纪元”日期之间的时间单位计数。为了将其转换为日期,您需要两条信息:刻度(时间戳 N 和 N+1 之间经过的时间量)和参考时间戳(通常是纪元日期,即数字 0 代表的日期/时间)。

    如果没有该信息,您将需要至少两个时间戳,以及每个时间戳代表的日期/时间。然后,您可以找到它们之间的差异,除以秒数,这将为您提供比例。然后,您可以推断找到纪元日期。

  • 第二种可能性是数字是一个位域,其中日期的每一部分都由整数中的一组位表示。

    如果是这样的话,那你就有点搞砸了。可能会进行各种数学运算以将日期部分放入位字段中。您将不得不询问负责系统的人,或者如果是您现在,请检查生成时间戳的代码。

编辑:如果我们采用您在评论中提供的数字:

635155956336800000  2013-9-24 05:00:33
635155957368670000  2013-9-24 05:02:16
635155968617830000  2013-9-24 05:21:10
635155968728200000  2013-9-24 05:21:12
635155971811300000  2013-9-24 05:26:21
635155972798800000  2013-9-24 05:27:59
635155978347870000  2013-9-24 05:37:14

让我们看看这些数字是否有意义。

取第一次和最后一次,找出它们各自时间戳之间的差异。

635155978347870000 - 635155956336800000 = 22011070000 滴答

除以两次相隔的秒数((37*60+14) - 33 == 2201 秒)

22011070000 滴答 / 2201 秒 = 10000486.142662 滴答/秒

四舍五入到一个不错的偶数,因为除非您混淆,否则时间戳基于有用的间隔。因此,在您的情况下,规模似乎是每秒 1000 万次滴答声,或每滴答声 100ns。

使用其他时间戳进行验证(在本例中为 5:27:59 和 5:00:33):

635155972798800000 - 635155956336800000 == 16462000000 滴答
16462000000 滴答 / 10000000 滴答/秒 = 1646.2 秒
(27*60+59) - 33 == 1646 秒

所以 100ns 看起来是对的。不过,为了确定,我们需要进一步分开时间戳。只是为了确保这确实是一个计数,而不是表示年份和当前第二个年份的两个 31 位数字。

假设这是一个计数,如果我们取第一个时间戳并除以 1000 万:

635155956336800000 滴答 / 10000000 滴答/秒 = 63515595633.6800000 秒

那是自纪元以来的 635 亿秒。作为参考,32 位签名时间戳(数量超过 20 亿)将在 2038 年用完,即 Unix 时代(1970 年)的 68 年。这个数字约为 29.58 倍,即 29.58 * 68 ~= 2011 年。

那将把这个时代放在公元一世纪初。1 CE 是一个足够重要的日期,它作为纪元日期是有意义的。不过,我不想做数学来确认这一点。

于 2013-10-02T18:29:32.550 回答
0

对应于 cHao 每秒 10000000 次滴答,但使用我最初建议的 01/01/0001 的基准日期:

$values = array(
    array(635155956336800000, "2013-9-24 05:00:33"),
    array(635155957368670000, "2013-9-24 05:02:16"),
    array(635155968617830000, "2013-9-24 05:21:10"),
    array(635155968728200000, "2013-9-24 05:21:12"),
    array(635155971811300000, "2013-9-24 05:26:21"),
    array(635155972798800000, "2013-9-24 05:27:59"),
    array(635155978347870000, "2013-9-24 05:37:14"),
);

function convert($date) {
    static $monthArray = array(
        31,29,31,30,31,30,31,31,30,31,30,31
    );
    $date = $date / 10000000 / 24 / 60 / 60;
    $y = floor($date / 365.2425);
    $YYYY = $y + 1;
    $z = 365 * $y + floor($y/4) - floor($y/100) + floor($y/400);
    $d = $date - $z;
    $month = 1;
    while (true) {
        $d -= $monthArray[$month - 1];
        if ($d < 0) break;
        $month++;
        $dd = $d;
    }
    $hh = ($dd - floor($dd)) * 24;
    $hours = floor($hh);
    $mm = ($hh - floor($hh)) * 60;
    $minutes = floor($mm);
    $ss = ($mm - floor($mm)) * 60;
    $seconds = floor($ss);
    return sprintf('%04d-%02d-%02d %02d:%02d:%02d', $YYYY, $month, floor($dd), $hours, $minutes, $seconds);
}

foreach($values as $value) {
    echo convert($value[0]), PHP_EOL;
}

给出:

2013-09-22 05:00:33
2013-09-22 05:02:16
2013-09-22 05:21:01
2013-09-22 05:21:12
2013-09-22 05:26:21
2013-09-22 05:27:59
2013-09-22 05:37:14

我不确定 2 天的差异来自哪里,但输出可能会任意添加 2 天,除非您使用接近 0 时间戳标记的极具历史意义的日期,否则它可能已经足够好了使用的功能

于 2013-10-02T22:27:49.657 回答