我正在处理 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
。
我不需要验证这些字符串是否代表真正的“日期”或“日期时间”值。
我正在处理 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);
也许您可以使用函数“date()”来格式化时间戳
<?php
$my_date = "2003-01-28 00:00:00";
$new_date = date("Y-m-d", time($my_date));
var_dump($new_date);
在这种情况下,的位置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;
?>
<?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);
?>
首先,如果您从您控制的较早层(例如 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” |
“0000-00-00 00:00:00” (无效的日期时间) |
“0000-00-00” (无效日期) |
|
---|---|---|
substr($datetime, 0, 10) |
“0000-00-00” | “0000-00-00” |
explode(' ', $datetime, 2)[0] |
“0000-00-00” | “0000-00-00” |
sscanf($datetime, '%s', $sscanf); $sscanf |
“0000-00-00” | “0000-00-00” |
preg_replace('/ .+/', '', $datetime) |
“0000-00-00” | “0000-00-00” |
(new \DateTime($datetime))->format('Y-m-d') |
“-0001-11-30” | “-0001-11-30” |
date("Y-m-d", strtotime($datetime)) |
“-0001-11-30” | “-0001-11-30” |
strtok($datetime, ' ') |
“0000-00-00” | “0000-00-00” |
strstr($datetime . ' ', ' ', true) |
“0000-00-00” | “0000-00-00” |
"" (空字符串) |
空 (空值) |
|
---|---|---|
substr($datetime, 0, 10) |
“” | “” |
explode(' ', $datetime, 2)[0] |
“” | “” |
sscanf($datetime, '%s', $sscanf); $sscanf |
无效的 | 无效的 |
preg_replace('/ .+/', '', $datetime) |
“” | “” |
(new \DateTime($datetime))->format('Y-m-d') |
“2021-08-21”(当前日期) | “2021-08-21”(当前日期) |
date("Y-m-d", strtotime($datetime)) |
“1970-01-01” | “1970-01-01” |
strtok($datetime, ' ') |
错误的 | 错误的 |
strstr($datetime . ' ', ' ', true) |
“” | “” |
一些明确的说明:
substr()
是这项工作的好工具,并在上述情况下返回稳定的值。explode()
是稳定的,但不是直接的,因为它需要在这个过程中创建一个数组。sscanf()
with%s
搜索前导子字符串,直到遇到空白字符。这是直接的,但有些人可能会争辩说它鲜为人知且不直观。unset()
此外,它还提供了在某些情况下可能需要的参考变量。这种确切的技术仅对这种特定情况有用。取决于输入字符串和分隔符如何变化,sscanf()
可能可行也可能不可行。preg_replace()
提供稳定的结果,但它永远不会在速度上获胜。坦率地说,当有非正则表达式技术可以做完全相同的事情时,推出正则表达式引擎没有任何好处。不建议。format()
当提供无效或缺失值时,可能会提供一些不需要的结果。我会争辩说,因为这仅仅是一个文本提取任务,所以没有必要实例化一个 datetime 对象并调用一个格式化方法。不建议。strtotime()
&date()
在提供无效或缺失值时会提供一些不需要的结果。当任务可以在一个函数调用中完成时,我看不出有任何理由调用两个函数。不建议。strtok()
当值保证有长度时,可能是最理想的并且是最简洁的技术。但是,当输入没有长度时,请注意布尔返回值。strstr()
可用于此任务,但为确保返回值稳定,分隔字符必须无条件附加到正在搜索的字符串。换句话说,必须找到分隔符。鉴于其他技术不需要改变输入字符串,这种技术只是感觉不必要的hacky。