从 PHP 字符串中识别日期格式

Moh*_*oub 4 php sql-server date

我正在尝试更新数据库中的所有日期字段,为所有表中的每个日期添加 5 天。

我设法将日期和行 ID 提取到数组中,然后生成 SQL 代码语句来更新它们。但是,每个表都有不同的日期格式,有些包含时间,有些不包含时间。我想在日期上添加 5 天,然后将其保存回来。目前,如果所有日期都具有相同的格式,我可以这样做,但这不足以解决我的问题。

我想要的是一个可以从日期字符串生成字符串格式的代码。例如:

日期字符串2014-12-04我希望代码表明该日期具有Y-m-d格式。如果日期字符串是,2017-04-03 11:11:48.653我希望代码说这个日期格式是Y-m-d h:i:s

Pha*_*aoh 6

如果您不需要保留格式(即您可以在添加五天的同时更改数据库中的格式),则可以将字符串扔到strtotime。如果可能的话,它将尝试检测格式:

$timestamp = strtotime($string_with_unknown_format);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用正则表达式检查不同的格式:

function extractDateTimeFormat($string) {
    if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $string))
        return 'Y-m-d';

    if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $string))
        return 'Y-m-d H:i:s';

    if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}$/', $string))
        return 'Y-m-d H:i:s.v';

    if (preg_match('/^\d{2}\/\d{2}\/\d{4}$/', $string))
        return 'm/d/Y';

    if (preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $string))
        return 'd.m.Y';
}
Run Code Online (Sandbox Code Playgroud)

然而,这可能会让人厌烦,具体取决于您期望的格式数量。另一方面 - 可以有多少个?

下一个替代方案是直接在字符串中用占位符替换数字 - 这会更灵活,但可能不太可预测。在这种情况下,行的顺序很重要。如果需要添加 12 小时格式 ( AM/ PM),则需要在 for 行之前插入行H:i:s,否则将不起作用。

function extractDateTimeFormat($string) {
    $string = preg_replace('/\b\d{4}-\d{2}-\d{2}\b/', 'Y-m-d');
    $string = preg_replace('/\b\d{2}\/\d{2}\/\d{4}\b/', 'm/d/Y');
    $string = preg_replace('/\b\d{2}\.\d{2}\.\d{4}\b/', 'd.m.Y');
    $string = preg_replace('/\b\d{2}:\d{2}\b:\d{2}\b/', 'H:i:s');
    $string = preg_replace('/\b\d{2}:\d{2}\b/', 'H:i');
    $string = preg_replace('/\.\d{3}\b/', '.v');

    if (preg_match('/\d/', $string) 
        return false;

    return $string;
}
Run Code Online (Sandbox Code Playgroud)

这样,您将独立检测日期和时间格式,因此您不必考虑每种可能的组合。
您必须检查实时数据哪种方法效果更好。