我有以下字符串......
“20:30 pm - 23:30 pm”
我正在尝试使用strtotime更改时间格式,但由于没有日期,因此返回FALSE。
$oldtime = "20:30pm - 23:30pm";
$newtime = explode(" - ", $oldtime);
foreach($newtime as $k => $t) {
$time[$k] = strtotime($t);
}
但是我的$ time数组出来了......
array(
0 => FALSE,
1 => FALSE
)
是否有将此更改为日期/时间对象并重新格式化而没有日/月/年?
理想的结果是“晚上8:30 - 晚上11:30”
答案 0 :(得分:2)
您可以使用DateTime::createFromFormat()
:
print_r(DateTime::createFromFormat("H:i+", "20:30pm"));
+
(docs)用于忽略尾随数据,在本例中为pm
个字符。
答案 1 :(得分:0)
您可以执行以下操作:
$oldtime = "20:30pm - 23:30pm";
$newtime = explode(" - ", $oldtime);
foreach($newtime as $k => $t) {
$time[$k] = DateTime::createFromFormat('H:iA', $t);
echo $time[$k]->format('H:i:s'); //or any other format you want
}
您可以获得更多信息:http://php.net/manual/en/datetime.createfromformat.php
答案 2 :(得分:0)
如果$oldtime = "20:30 - 23:30";
然后你可以试试这个
$oldtime = "20:30 - 23:30";
$newtime = explode(" - ", $oldtime);
foreach($newtime as $k => $t) {
$time[$k] = date("g:i a", strtotime($t));
}
print_r($time);
答案 3 :(得分:0)
使用类似下面的内容。然而,datetime convertion将显示执行日
public function test2(){
$oldtime = str_replace("pm","","20:30pm - 23:30pm");
$newtime = explode(" - ", $oldtime);
foreach($newtime as $k => $t) {
$time[$k] = strtotime($t);
}
print_r($time);
echo $time = date("m/d/Y h:i:s A T",$time[0]);
}
答案 4 :(得分:0)
更新了答案
这个答案来自@KrisRoofe,他建议根据字符串值及其时间格式实例化DateTime对象。他还建议如何通过在时间格式字符串中包含“+”来消除使用str_replace()的需要 - 很好!所以,这是这个答案的基础,但它也有一些值得注意的差异,如下:
<?php
$oldtime = "20:30pm - 23:30pm";
$newtime = explode("-", $oldtime );
$arrStr = [];
$arrObj = [];
foreach($newtime as $elem) {
$o = DateTime::CreateFromformat( 'H:i+',trim($elem) );
$arrObj[] = $o;
$arrStr[] = $o->format('g:iA');
}
echo join(" - ",$arrStr);
请参阅live code
在包含军事格式的时间的字符串爆炸时,生成的数组存储在$ newtime中。 foreach使用每个元素的值迭代数组。
循环中发生静态调用,使用DateTime类的CreateFromformat方法生成一个存储在$ o中的DateTime对象。然后将对象$ o分配给数组。因此,代码具有一个DateTime对象数组,其中包含原始字符串值。
接下来在foreach中,$ o使用其format()方法重新格式化其date属性的值,以便新的字符串结果包含12小时格式的时间。该结果存储在一个数组字符串中,这些字符串最终会根据OP的请求产生理想的结果。