使用PHP将字符串转换为格式化日期

使用PHP将字符串转换为格式化日期,php,string,date,Php,String,Date,我有以下字符串: $str = "Tuesday, February 21 at 7:30am at Plano B"; 平面B上的是可选的。我想将其转换为:2月21日星期二07:30 $str = "Tuesday, February 21 at 7:30am at Plano B"; $time = strtotime(trim(substr($str,0,(strrpos("at")))); echo "Date: " . strtoupper(date('D d M H:i', $ti

我有以下字符串:

$str = "Tuesday, February 21 at 7:30am at Plano B";
平面B上的
是可选的。我想将其转换为:
2月21日星期二07:30

$str = "Tuesday, February 21 at 7:30am at Plano B";
$time = strtotime(trim(substr($str,0,(strrpos("at"))));
echo "Date: " . strtoupper(date('D d M H:i', $time));
你所说的“在平面B是可选的”是什么意思。它有时在那里,有时不在

否则:

$str = "Tuesday, February 21 at 7:30am at Plano B";
preg_match("/[a-z]+, ([a-z]+ [0-9]{1,2}) at ([0-9]{1,2}:[0-9]{1,2}[am|pm])/i", $str, $match);

$time = strtotime($match[1] + ' ' + $match[2]);
echo "Date: " . strtoupper(date('D d M H:i', $time));
它总是“平面B”还是空的?或者它也可能是“平面A”或完全不同的东西

请看这里:

但是您在初始字符串中缺少年份,因此无法将其解析为strotime。您还希望输出不带am/pm。。您想使用24小时制吗

这不是一个很好的方式,但是如果没有这一年,我想我们没有太多的选择

preg_match("/([a-z]+), ([a-z]+) ([0-9]{1,2}) at ([0-9]{1,2}:[0-9]{1,2})([am|pm])/i", $str, $match);
$day = substr($match[1], 0, 3);
$mon = substr($match[2], 0, 3);
echo strtoupper($day . " " . $match[3] . " " . $mon . " " . $match[4]);

我想提出一个稍微不同的解决方案,基于不经常使用的。它使用预定义的格式来解析字符串

示例:

<?php

// Specify a default timezone just in case one isn't set in php.ini.
date_default_timezone_set('America/Vancouver');

$str = "Tuesday, February 21 at 7:30am at Plano B";
if ($time = strptime($str, '%A, %B %e at %l:%M%P')) {
    // This will default to the current year.
    echo strtoupper(date('D d M H:i', mktime($time['tm_hour'], $time['tm_min'], 0, $time['tm_mday'], $time['tm_mon'])));
}
SUN 01 SEP 07:30

通常的答案是
strotime()
,但是“at Plano B”会把它弄糊涂。每个字符串是否有一个共同的结构(例如,“每个字符串将包含”at“”)?字符串可以在这两种格式之间更改:2月21日星期二上午7:30在Plano B和2月21日星期二上午7:30没有最后一个“at…”@Pekka,当然不需要“at”,有“am”和“pm”要在位置丢失时挂起任何regex off.bugs:
“2月21日星期二上午7:30”
它可以是'Plano B',空的或任何其他字符串。在上面的示例中,输出始终是日期:Thu 01 Jan 01:00,以及我尝试过的所有日期:(在
preg_match
之后添加以下内容:
echo”“。打印($match,1)。”;
以确保结果正确。我没有用PHP测试代码,只有regexEhm,我认为它实际上错过了通过
strotime
解析的年份。有没有办法将年份添加到字符串中?现在不是完整日期。。
SUN 01 SEP 07:30