Php 时间格式->;635151121709530000?

Php 时间格式->;635151121709530000?,php,datetime,time,timestamp,Php,Datetime,Time,Timestamp,谁能告诉我这个6351511121709530000是什么时间格式,以及如何转换,结果是类似2013-9-18 14:42:50的 谢谢这里没有足够的信息将您的号码转换为时间。表示时间点至少有两种常用方法: 第一个(也是最常见的)是数字表示时间戳表示的时间和某个“历元”日期之间的时间单位计数。为了将其转换为日期,您需要两条信息:刻度(时间戳N和N+1之间经过的时间量)和参考时间戳(通常是纪元日期,即数字0表示的日期/时间) 如果没有这些信息,您至少需要两个时间戳,每个时间戳代表的日期/时间。然

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

谢谢

这里没有足够的信息将您的号码转换为时间。表示时间点至少有两种常用方法:

  • 第一个(也是最常见的)是数字表示时间戳表示的时间和某个“历元”日期之间的时间单位计数。为了将其转换为日期,您需要两条信息:刻度(时间戳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
让我们看看这些数字作为计数是否有意义

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

63515597834787000-6351559565636800000=22011070000滴答声

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

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

四舍五入到一个很好的偶数,因为时间戳是基于有用的间隔的,除非你混淆了。在你的例子中,它看起来是每秒1000万个滴答声,或者每滴答声100纳秒

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

63515597279800000-6351559563336800000==16462000000个刻度
16462000000滴答声/10000000滴答声/秒=1646.2秒
(27*60+59)-33==1646秒

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

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

63515595636800000滴答声/10000000滴答声/秒=63515595633.6800000秒

这是从新纪元以来的635亿秒。作为参考,32位有符号时间戳(其数字超过20亿位)将在2038年用完,即从Unix时代(1970年)开始的68年。这个数字大约是这个数字的29.58倍,即29.58*68~=2011年


这使这个时代大约在公元一世纪初。1 CE是一个足够重要的日期,它可以作为大纪元日期。不过,我不想通过计算来证实这一点。

与赵的每秒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;
}

我不确定2天的差异从何而来,但输出可能会任意添加2天,除非您使用非常接近0时间戳标记的历史日期,否则它可能是一个足够好的函数,可以使用

可能以毫秒为单位的朱利安日期?但是为什么不问问提供信息的人呢?不能,这个项目的工作人员死了,当然也没有文档。也许会有帮助。自1/1/0001以来已经有大约63525448800秒,因此从1/1/0001开始可能是微秒then@Armando:如果你有第二个时间格式的例子,以及它应该是什么(或者至少,它应该是什么)。您可以使用一个吗?一些其他记录:63515595636800000 2013-9-24 05:00:33 6351559557368670000 2013-9-24 05:02:16 6351559668617830000 2013-9-24 05:21:10 63515596872800000 2013-9-24 05:21:12 635155971811300000 2013-9-24 05:26:21 6351559727798800000 2013-9-24 05:27:59 63515597877870000表中的一些其他记录: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@Armando:根据这些日期,您完全可以使用选项1(第一个和最后一个之间的差值是秒*100000000)。出于某种原因,您的纪元似乎是1812-06-25T08:56:02+00:00。。。
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