从日期时间戳字符串中删除可选的时间组件


Remove optional time component from datetime stamp string

我正在处理PHP脚本中的一些字符串,这些字符串可能是Y-m-d H:i:sY-m-d格式。我需要从日期时间字符串中删除 H:i:s部分,以便始终处理Y-m-d日期字符串。

如果存在,我如何删除这个尾随字符串(及其前导空格)

我的字符串可能看起来像2003-11-24 23:52:182009-01-25

我对这些字符串的预期结果是2003-11-242009-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-282003-01-28 00:00:002003-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:sY-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"