我们正在设计一种新的传感器,可以将一些数据发送到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(如日期时间)可能更容易。
答案 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然后执行此操作,否则执行此操作。 这对我来说更容易检查每个值。