PHP различают только дату и время, а также оба - PullRequest
0 голосов
/ 08 октября 2018

Я публикую это оптимистично после поиска ответа здесь на SO, и даже когда SO говорит мне, что мой вопрос может быть закрыт, так как я думаю, что в этом случае это правильный вопрос.

Рассмотрим файл CSVсо столбцом, содержащим строку, представляющую либо даты, либо время, либо оба.Я хочу выяснить после просмотра столбца, просто - точно какой это тип столбца, а не только то, что это действительная "дата"?

функция PHP strtotime делает потрясающую работу по возвращению метки времени Unix практически для любой строки date-time-ish.Но (сегодня, когда я выкладываю это 8/8/2018), 3:45PM и 15:45:00 и 10/8/2018 3:45PM будут возвращать одно и то же время Unix, хотя, очевидно, первые два раза.

Как определить, является ли строка строго компонентом даты, компонентом времени или и тем и другим?

PS Если бы мне пришлось писать функцию самостоятельно, пока наилучшим отрывом было быискать в строке :, что означало бы наличие компонента времени (означающего либо время, либо дату / время).Если он анализируется как дата и время, но без :, то мы можем предположить, что это только дата.Но опять же, мне интересно, есть ли у PHP более элегантный способ.Вот «довольно хорошее» решение:

PPS эта функция на самом деле является «очень хорошим» решением благодаря умному предложению @ KarstenKoop в комментариях о втором параметре для strtotime:

function date_time_component($date){
    if(strtotime($date) === false) return false;
    if(strtotime($date, 86400) !== strtotime($date, 86400 * 2)) return 'time';
    if(strstr($date, ':')) return 'datetime';
    return 'date';
}

1 Ответ

0 голосов
/ 08 октября 2018

Вы должны начать , написав набор тестов, которые вы могли бы включить в свой вопрос.Существует множество различных способов написания дат и несколько способов записи времени.

Вот некоторые из них, с которых можно начать:

даты

 2018-10-08
 08/10/2018
 10/08/2018
 08-10-2018
 10-08-2018
 10-Oct-2018
 20181008
 10 Oct 2018
 10th October 2018
 October, 10th 2018

раз

 1121
 11:21
 11:21 AM
 11:21
 11:21:46
 11:21:46 AM

Часовые пояса

 +00:00
 +0
 +0000
 Europe/London

Тогда у вас есть все возможные комбинации из 3 компонентов:

date
date time
date time timezone
time
time timezone
time date
time timezone date

Это дает 400 различных форматов (не все из которых являются уникально разрешимыми).

(использование strtotime для выполнения тяжелой работы начинает иметь большой смысл).Но вместо того, чтобы пытаться анализировать данные, поиск конкретных шаблонов может быть лучшим подходом: есть ли строки букв?+ или -?Сколько цифр?Сколько последовательных цифр?

Вы все равно должны начать со списка тестовых случаев.

...