1

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

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

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

我对这些字符串的预期结果是2003-11-242009-01-25

我不需要验证这些字符串是否代表真正的“日期”或“日期时间”值。

4

6 回答 6

3

由于日期的长度始终是固定的。您可以使用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);          
于 2013-08-27T02:59:08.793 回答
1

您的传入数据是日期字符串,因此请按此处理并使用DateTime对其进行操作。您的解决方案可能很简单:-

$dateString = (new \DateTime('2003-01-28 00:00:00'))->format('Y-m-d');
//$dateString now === '2003-01-28'

即使时间部分 (00:00:00) 丢失,这也将起作用。即使日期和时间之间没有空格。

如您所见,这应该涵盖所有可能的输入。

于 2013-08-27T07:47:25.400 回答
1

您可以使用简单的explode或评论中指出的,substr但如果您不知道如何date('Y-m-d', strtotime($mytime)) 根据更新的帖子将字符串格式化为更复杂的...

$newdate = substr($olddate,0,10);
于 2013-08-27T02:51:13.503 回答
0

也许您可以使用函数“date()”来格式化时间戳

<?php
$my_date = "2003-01-28 00:00:00";
$new_date = date("Y-m-d", time($my_date));
var_dump($new_date);
于 2013-08-27T04:39:04.377 回答
0

编辑#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);

?>
于 2013-08-27T03:01:57.963 回答
0

首先,如果您从您控制的较早层(例如 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”
“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) “” “”

一些明确的说明:

  1. substr()是这项工作的好工具,并在上述情况下返回稳定的值。
  2. explode()是稳定的,但不是直接的,因为它需要在这个过程中创建一个数组。
  3. sscanf()with%s搜索前导子字符串,直到遇到空白字符。这是直接的,但有些人可能会争辩说它鲜为人知且不直观。unset()此外,它还提供了在某些情况下可能需要的参考变量。这种确切的技术仅对这种特定情况有用。取决于输入字符串和分隔符如何变化,sscanf()可能可行也可能不可行。
  4. preg_replace()提供稳定的结果,但它永远不会在速度上获胜。坦率地说,当有非正则表达式技术可以做完全相同的事情时,推出正则表达式引擎没有任何好处。不建议。
  5. format()当提供无效或缺失值时,可能会提供一些不需要的结果。我会争辩说,因为这仅仅是一个文本提取任务,所以没有必要实例化一个 datetime 对象并调用一个格式化方法。不建议。
  6. strtotime()&date()在提供无效或缺失值时会提供一些不需要的结果。当任务可以在一个函数调用中完成时,我看不出有任何理由调用两个函数。不建议。
  7. strtok()当值保证有长度时,可能是最理想的并且是最简洁的技术。但是,当输入没有长度时,请注意布尔返回值。
  8. strstr()可用于此任务,但为确保返回值稳定,分隔字符必须无条件附加到正在搜索的字符串。换句话说,必须找到分隔符。鉴于其他技术不需要改变输入字符串,这种技术只是感觉不必要的hacky。
于 2021-08-21T03:57:25.397 回答