检查值是否为datetime

时间:2017-05-12 07:22:39

标签: php datetime

我们正在设计一种新的传感器,可以将一些数据发送到Web应用程序。我们使用类似的传感器,但他们使用数据通道将发送到应用程序的值划分为不同的数据类型。

然而,这个新传感器将发送数据或32位时间,毫秒。它不会发送标识符位以查看该值是数据还是时间戳。

因为数据和时间戳都是整数值,我如何检查它是哪一个?

时间戳将是

  

YYYY / MM / DD HH:MI:SS:vv

我已经找到了preg_match,就像这样:

if (preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $value))

但我如何包含毫秒?或者有一种比简单的更好的方法吗?

更新

我希望应用程序收到的日期将在int16中。 因此,计算收到的值并处理值9和10(如日期时间)可能更容易。

3 个答案:

答案 0 :(得分:5)

您可以使用createFromFormat()中的PHP DateTime object方法。

您将创建一个检查方法错误的函数:

function is_valid_date($date, $format = 'Y/m/d H:i:s.u')
{
    $d = DateTime::createFromFormat($format, $date);
    $errors = DateTime::getLastErrors();         

    return (
        $errors['warning_count'] == 0 && 
        $errors['error_count'] == 0 &&
        $d !== false
    );
}

希望它有所帮助。

编辑:

以默认格式添加u(微秒)。

答案 1 :(得分:1)

您可以使用此正则表达式:

使用preg_match_all

preg_match_all("/(\d{4})\/(\d{2})\/(\d{2})\s(\d{2})\:(\d{2})\:(\d{2})\:(\d{2})/", $input_lines, $output_array);

使用preg_match

preg_match("/(\d{4})\/(\d{2})\/(\d{2})\s(\d{2})\:(\d{2})\:(\d{2})\:(\d{2})/", $input_line, $output_array);

请注意,它只会检查数字,反斜杠和“:”字符。它不会检查给定的数字是否有效。

一旦运行了正则表达式,就可以检查输出数组并查看它是否为空(如果它不是空的,则与格式匹配)

正则表达式匹配此范围:

0000/00/00 00:00:00:00
9999/99/99 99:99:99:99

答案 2 :(得分:0)

我以不同的方式修复它:

我们确定消息中的前2个16位值始终是时间戳,所以我只创建了一个valuecounter并使用if $ value为1或2然后执行此操作,否则执行此操作。 这对我来说更容易检查每个值。