【问题标题】:Date format in float from Persavise db来自 Persavise db 的浮点日期格式
【发布时间】:2016-08-11 17:58:17
【问题描述】:

我从 Persavive V12 Db 获得数据。日期的格式很奇怪。 它们就像浮动:

Example of date in table : 39787.0

有人知道这种格式吗?这似乎是从 1901-01-01 开始的天数。

由于日期是浮动的,是否可以在 PHP 中从日期开始添加天数?喜欢:

$from = '1901-01-01';
$date = date('Y-m-d', strtotime($from .' +'. $float .' days'));

我总是得到 1970-01-01。还有其他方法吗?

【问题讨论】:

  • strtotime 将输出一个 unix 时间戳,这意味着第一天可能是 1970 01 01 写这个日期的软件是什么?也许我们可以搜索一下日期格式是什么。
  • Pervasive 数据库中的字段是否在 DDF 中标记为 Float? Pervasive 多年来一直有一个 Date 字段,它不是 Float。 .这是来自您开发的应用程序还是第三方?您是否联系过该应用的供应商以了解日期格式?
  • 不幸的是我无法访问数据库知道,只是从数据库中获取数据但没有 DDF。我将尝试在本地 Pervasive 服务器中查找日期格式。

标签: php btrieve


【解决方案1】:

我的第一个答案,所以不要伤害我太多。 我不太确定你想做什么(放回数据库或执行进一步的操作,所以我只发布了一个解决方案)

您发布的数字 39787.0 是一个 unix 时间戳。您需要使用 mktime 将您想要的内容转换为数字(并且您需要 date 将其转换为可读形式)。由于 mktime 也使用 1901-01-01 作为开始日期,因此您必须进行一些更改。

我是一个商业懒惰的人,并没有包含所有字段的所有代码,但这应该允许您修改以添加您想要的任何内容(如果您愿意,可能会将其清理为一行)。 我写的很长,所以很容易阅读。

    <?

    $olddate = 39787.0;
    $hour = 0;
    $min =  0;
    $sec =  0;
    $month =  0;
    $year = 0;
    $day = 12;
    $month += date("m",$olddate);
    $day += date("d",$olddate);
    $year += date("Y",$olddate);
    $x = date("Ymd",mktime($hour,$min,$sec,$month,$day,$year));
    echo $x;

    ?>

【讨论】:

  • 这不是 Unix 时间戳。由于时间戳更像1470943987。如果是,你只需要使用 date('d-m-Y', $timestamp),不需要 mktime。
【解决方案2】:

如果 39787.0 在数据库中,那么在实际日期(使用应用程序)中它的值是多少?如果是 2008 年 12 月 5 日,则它是 VB 日期。你知道应用程序是用什么写的吗?我见过人们使用 VB Date 数据类型并将其存储在 Btrieve 中的 8 字节浮点数中(早在 2003 年)。如果是 VB 日期,则 1 为 1899-12-31。您应该能够将数字添加到 1899-12-30 以获得正确的日期值。比如:

<?php
$date = new DateTime('1899-12-30');
$date->add(new DateInterval('P39787D'));
echo $date->format('Y-m-d') . "\n";
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2021-07-07
    相关资源
    最近更新 更多