具有各种格式的字符串的日期和时间

时间:2018-05-04 07:41:54

标签: php datetime

客户正在为我的团队创建门票,其中包含要在不同时间完成的任务。日期和时间写在说明中,但每种票证的格式可能不同,例如:

  

Todo:4月26日星期四19日

     

Todo:2014年4月25日星期三14:00至14:30之间

     

Todo:周一,4月25日11点到11点30分

     

Todo:30.03.2018 13h30 - 14h00

我创建了一个函数,它接受包含日期和时间的字符串(冒号爆炸后)并尝试将其转换为可在datetime-local字段中使用的标准格式(don&# 39;关心几秒钟。

public static function getDatetime ( string $datetime )
{
    $formats[] = "dS * F * G?i+";
    $formats[] = "* dS * F * G?i+";
    $formats[] = "D d#m#Y * G#i+";
    $formats[] = "d M Y * G:i+";
    $formats[] = "* d F Y G?i+";
    $formats[] = "* d F Y * G?i+";
    $formats[] = "* j F * g#i A+";
    $formats[] = "* j F * h A+";
    $formats[] = "*# d F * g#i a+";
    $formats[] = "*# M d Y * G?i+";
    $formats[] = "*# F d * g a+";
    $formats[] = "* d F * G\hi+";
    $formats[] = "* d#m * G:i+";
    $formats[] = "d#m#Y G\hi+";
    $formats[] = "d#m#Y * G?i+";
    $formats[] = "* d#m#Y G\Hi+";
    $formats[] = "* d#m#Y * G\hi+";
    $formats[] = "d#m#Y * G\h+";
    $formats[] = "* d#m#Y * G\h+";
    $formats[] = "* dS * F, * G\h+";
    $formats[] = "* dS F * G\h+";
    $formats[] = "* d * M Y * G?i+";
    $formats[] = "dS * F * G+";
    $formats[] = "* dS * F * G+";
    $formats[] = "* dS F Y * G?i+";
    $formats[] = "* d#m#Y * G?i+";
    $formats[] = "* d#m#Y * G+";
    $formats[] = "*# dS M Y * G?i+";
    $formats[] = "*# dS M Y * G+";
    $formats[] = "d S * M * G+";

    foreach ( $formats as $format )
    {
        if ( DateTime::createFromFormat ( $format, $datetime ) !== false )
        {
            return DateTime::createFromFormat ( $format, $datetime )->format ( 'Y-m-d\TH:i' );
        }
    }

    return;
}

正如您所看到的,我已经创建了一个包含大约20种格式的数组,我将循环播放这些格式,并且只要字符串与格式匹配,我就会返回格式化日期。为了实现这一点,我必须在数组中更通用的格式之前添加更具体的格式。

此函数适用于我目前遇到的大约80-90%的案例,不包括拼写错误或字符串甚至人类无法阅读的案例。

问题是,客户可能会随机决定添加一个逗号来分隔日期名称和日期,或者反转日期和月份,在这种情况下,我必须创建一个新的格式。

一个简单的例子:

$datetime = "Monday, 08 January at 8:00 am";
$formats[] = "*# d F * g#i a+";

$datetime = "Thursday, April 18 at 7:30 pm";
$formats[] = "*# F d * g#i a+";

在我创建此功能之前,我尝试使用preg_replacestr_replace仅保留字符串中所需的内容,然后将其传递给strtotime,但这肯定更糟! / p>

我的问题是,有更好的方法吗?如果没有,我是否至少可以做一些简单的事情来避免为非常相似的字符串提供多种格式(如前2个)?

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,为避免格式太多,您需要限制客户端提供这些信息的方式(例如:对于Web应用程序,而不是使用文本框,用户可以在其中放置任何格式的自由文本,使用日历控件,只返回特定格式),这可以避免拼写错误和无效日期(例如2月30日)。

否则,正如您所说,客户端可以继续添加新格式:)