Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查值是否为datetime_Php_Datetime - Fatal编程技术网

Php 检查值是否为datetime

Php 检查值是否为datetime,php,datetime,Php,Datetime,我们正在设计一种新的传感器,将一些数据发送到网络应用程序。我们使用类似的传感器,但它们使用数据通道将发送到应用程序的值划分为不同的数据类型 但是,这种新传感器将发送数据或32位时间,单位为毫秒。它不发送标识符位来查看值是数据还是时间戳 因为数据和时间戳都是整数值,我如何检查它是哪一个 时间戳将是 YYYY/MM/DD HH:MI:SS:vv 我已经找到了preg_match,如下所示: if (preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $value))

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

但是,这种新传感器将发送数据或32位时间,单位为毫秒。它不发送标识符位来查看值是数据还是时间戳

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

时间戳将是

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

我已经找到了preg_match,如下所示:

if (preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $value))
但是我如何包括毫秒呢?或者有比简单的if-else更好的方法吗

更新

我希望申请收到的日期是int16。
因此,计算接收到的值并像datetimes一样处理值9和10可能更容易。

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

使用
preg\u match\u all

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

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
您可以使用来自的方法

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

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
(微秒)。

我用另一种方式修复了它:

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

您可以使用DateTime对象:查看我的更新的可能重复项,我不认为它是重复项。。谢谢,我仍然需要检查数据将如何呈现给应用程序,因为我还不知道。如果以int表示,preg_match可能不起作用,那么我必须使用计数或其他方法从消息中获取最后2个值。(消息包含10个值,最后2个是时间戳)谢谢。这在if语句中可能会有所帮助。我们将对此进行更深入的研究。如果($value=is\u valid\u date),那么它可以是一个
,然后。。。。。其他数据类型
。从我的头顶上。-@马可很高兴这有帮助。谢谢验证这个答案,如果它解决了你的问题。祝你好运是的,如果这是我的选择,我会的。但是,我们确定消息中的前2个16位值始终是时间戳,因此我只制作了一个valuecounter,并使用了一个if$值为1或2的值,然后执行此操作,否则执行此操作。;)