我正在处理PHP脚本中的一些字符串,这些字符串可能是Y-m-d H:i:s
或Y-m-d
格式。我需要从日期时间字符串中删除 H:i:s
部分,以便始终处理Y-m-d
日期字符串。
如果存在,我如何删除这个尾随字符串(及其前导空格)?
我的字符串可能看起来像2003-11-24 23:52:18
或2009-01-25
。
我对这些字符串的预期结果是2003-11-24
和2009-01-25
。
我不需要验证这些字符串表示真实的";日期";或";日期时间";价值观
因为日期的长度总是固定的。您可以使用substr
。
// With 00:00:00
$date = '2003-01-2800:00:00';
echo substr($date, 0, 10) . '<br>';
// Without 00:00:00
$date = '2003-01-28';
echo substr($date, 0, 10) . '<br>';
// With other time part
$date = '2003-01-2812:00:11';
echo substr($date, 0, 10);
您可以使用一个简单的explode
或如评论substr
中所述,但如果您不知道如何根据更新的帖子格式化字符串,则可以使用更复杂的date('Y-m-d', strtotime($mytime))
。。。
$newdate = substr($olddate,0,10);
您的传入数据是一个日期字符串,因此将其视为日期字符串并使用DateTime对其进行操作。您的解决方案可以简单到:-
$dateString = (new 'DateTime('2003-01-28 00:00:00'))->format('Y-m-d');
//$dateString now === '2003-01-28'
即使缺少时间部分(00:00:00),这也会起作用。即使在日期和时间之间没有间隔。
正如您所看到的,这应该涵盖您所有可能的输入。
编辑#2(使用str_replace)
在这种情况下,00:00:00
的位置无关紧要,即使日期之间没有空格。
在00:00:00 2003-01-28
、2003-01-28 00:00:00
和2003-01-2800:00:00
上的工作
<?php
$if_date_null = "00:00:00";
$replace = ""; // replace with nothing
// doesn't matter the position of 00:00:00
$dates = "00:00:00 2003-01-28";
// $dates = "2003-01-28 00:00:00";
$result = str_replace($if_date_null,$replace,$dates);
echo $result;
?>
编辑#1
<?php
$date = "2003-01-28";
$date_null = "00:00:00";
if (strpos($date_null,'00:00:00') !== false) {
echo '00:00:00 found ';
}
else {
echo "No ZEROS found ";
}
?>
原始答案
这将呼应2003-01-28,不包括2003-01-28和00:00:00 之间的空间
<?php
echo substr("2003-01-28 00:00:00",0,-9);
?>
您也可以将日期指定为这样的变量:(将产生相同的结果),并在需要时在其他地方使用该变量。
<?php
$date = "2003-01-28";
echo substr("$date 00:00:00",0,-9);
?>
也许您可以使用函数"date()"来格式化时间戳
<?php
$my_date = "2003-01-28 00:00:00";
$new_date = date("Y-m-d", time($my_date));
var_dump($new_date);
首先,如果您从您控制的早期层(如sql结果集)接收这些输入数据,那么您可能应该在php接触字符串格式之前对其进行标准化。如果这些数据来自某种sql,如COALESCE(my_datetime, my_date) AS datetime_or_date
,然后,您就可以避免php对结果集的每一行执行潜在的迭代调用。在您的合并过程中,根据场景的不同,可以简单地利用一些函数,如CAST()
、DATE()
、DATE_FORMAT()
、CONVERT()
或STR_TO_DATE()
。
现在,这项任务的范围似乎相当狭窄。输入数据是Y-m-d H:i:s
或Y-m-d
。这与验证无关,只是文本提取。在这种情况下,有几种php技术是可信的(有些是不可信的)。对于可能没有有效日期/日期时间值,或者这些值可能是空字符串,甚至是null
的研究人员,您应该小心您使用的函数/技术可能产生的副作用。
考虑以下测试字符串和技术的表格,并谨慎选择:(演示)
"2003-01-28 01:23:45" (有效日期时间) |
"2007-04-04" (有效日期) |
|
---|---|---|
substr($datetime, 0, 10) |
"2003-01-28" | "2007-04-04" |
explode(' ', $datetime, 2)[0] |
"2003-01-28" | "2007-04-04" |
sscanf($datetime, '%s', $sscanf); $sscanf |
"2003-01-28" | "2007-04-04" |
preg_replace('/ .+/', '', $datetime) |
"2003-01-28" | "2007-04-04" |
(new 'DateTime($datetime))->format('Y-m-d') |
"2003-01-28" | "2007-04-04" |
date("Y-m-d", strtotime($datetime)) |
"2003-01-28" | "2007-04-04" |
strtok($datetime, ' ') |
"2003-01-28" | "2007-04-04" |
strstr($datetime . ' ', ' ', true) |
"2003-01-28" | "2003-04-04" |