在 PHP 中检查日期是 12 小时格式还是 24 小时格式?

问题描述

例如,如果是 12 小时格式,我想检查日期并将其转换为 24 小时格式

$date="2021-02-5 11:45:00 AM"

在我检查之后:

 if (preg_match("/am|pm|AM|PM/",$date))
        {
            $date=date('Y-m-d H:i:s',strtotime("$date"));
        }

我的输出应该是这样的,但它不能正常工作,

$date="2021-02-5 11:45:00";

但是,它不能正常工作,两种日期格式都输入到 if 条件中。

解决方法

转换时间格式

// 24-hour time to 12-hour time 
$time_in_12_hour_format  = date("g:i a",strtotime("13:30"));

// 12-hour time to 24-hour time 
$time_in_24_hour_format  = date("H:i",strtotime("1:30 PM"));
,
date_create_from_format('Y-m-j H:i:s A',$date);

它会返回一个 DateTime 对象,你可以得到你想要的正确日期,如果日期字符串与模式不匹配,它会返回 false。

DateTime Object
(
    [date] => 2021-02-05 11:45:00.000000
    [timezone_type] => 3
    [timezone] => UTC
)
date_create_from_format ( string $format,string $time,DateTimeZone $timezone = ? ) : DateTime
,

您不需要 regex 来检查是 24 小时还是 12 小时。您可以简单地将日期传递给 strtotime 函数以获取日期的时间戳,然后使用 date 函数格式化时间戳。

$date="2021-02-5 11:45:00 AM";
$date=date('Y-m-j H:i:s',strtotime($date));
echo $date;  // 2021-02-5 11:45:00
,

使用 strtotime 您无法控制格式。要更好地了解正在发生的事情,请使用功能丰富的 DateTime 类。首先将字符串转换为 DateTime 对象,然后将其格式化为您需要的任何内容。

<?php
$dt = "2021-02-5 11:45:00 pm";

if (preg_match('/am$|pm$/i',$dt)) // is there an Ante meridiem/Post meridiem suffix?
{
    $dtFormat = 'Y-n-j H:i:s a';
}
else 
{
    $dtFormat = 'Y-n-j H:i:s';
}

$ts = DateTime::createFromFormat($dtFormat,$dt);
$date = $ts -> format('Y-m-d H:i:s');

// echo 'Result: '. $date;