PHP Невозможно разобрать YY-MM-DD HH: MM: формат SS, выбранный из файла с разделителями табуляции [дубликат]

Правильный ответ:

select table_record_id,
group_concat(if(value_name='note', value_text, NULL)) as note
,group_concat(if(value_name='hire_date', value_text, NULL)) as hire_date
,group_concat(if(value_name='termination_date', value_text, NULL)) as termination_date
,group_concat(if(value_name='department', value_text, NULL)) as department
,group_concat(if(value_name='reporting_to', value_text, NULL)) as reporting_to
,group_concat(if(value_name='shift_start_time', value_text, NULL)) as shift_start_time
,group_concat(if(value_name='shift_end_time', value_text, NULL)) as shift_end_time
from other_value
where table_name = 'employee'
and is_active = 'y'
and is_deleted = 'n'
GROUP BY table_record_id
225
задан Mark 17 April 2015 в 14:44
поделиться

7 ответов

Используйте strtotime() в вашей первой дате, затем date('Y-m-d'), чтобы преобразовать его:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

Обратите внимание, что существует разница между использованием косой черты / и дефиса - в функцию strtotime() . Процитировать из php.net:

Даты в форматах m / d / y или dmy устраняются путем поиска разделителя между различными компонентами: если разделитель является косой чертой (/), то предполагается американский м / д / у; тогда как если разделитель является тире (-) или точкой (.), тогда предполагается европейский формат d-m-y.

361
ответ дан fedorqui 21 August 2018 в 01:17
поделиться
  • 1
    Это не сработает. PHP будет интерпретировать этот ввод как DD-MM-YYYY. – Matthew 4 June 2011 в 21:24
  • 2
    Я добавил немного больше объяснений в свой код, благодаря @konforce – Ibu 4 June 2011 в 21:29
  • 3
    Прочтите следующий ответ для лучшего решения – Manuel Bitto 14 June 2013 в 23:45
  • 4
    Я получаю 1970, но не во всех ... – delive 5 April 2016 в 10:44
  • 5
    @delive строка даты, скорее всего, неверная дата. – Ibu 5 April 2016 в 18:34

Вы должны быть осторожны с форматами m / d / Y и m-d-Y. PHP считает, что / означает, что m / d / Y и - означают d-m-Y. Я бы явно описал формат ввода в этом случае:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

Таким образом, вы не находитесь в капризе определенной интерпретации.

343
ответ дан Matthew 21 August 2018 в 01:17
поделиться
  • 1
    Любопытно, почему это не принятый ответ ... Это гораздо более гибко, чем полагаться на причуды функции strtotime(). – jzimmerman2011 4 December 2012 в 23:43
  • 2
    Важно указать, что класс php DateTime доступен с PHP версии 5.2 и createFromFormat , так как 5.3 – Diego Alcántara 23 September 2013 в 20:10
  • 3
    Как и для каждой функции, вы должны проверить, соответствует ли она минимальной версии, которую вы должны поддерживать. Но PHP 5.2 EOL был январем 2011 года. Никто не должен его запускать; обслуживание этих людей просто позволяет им использовать устаревшее, небезопасное программное обеспечение. – Matthew 24 September 2013 в 03:24

Если у вас есть формат dd-mm-yyyy, то в PHP он не будет работать должным образом. В PHP-документе у них есть рекомендации ниже.

Даты в форматах m / d / y или dmy устраняются путем просмотра разделителя между различными компонентами: если разделитель является косой чертой (/), то американский m / d / y предполагается; тогда как если разделитель является тире (-) или точкой (.), тогда предполагается европейский формат d-m-y.

Итак, вы просто не можете использовать, как хотите. Когда вы попытаетесь использовать формат dd / mm / yyyy с этим, тогда он удалит FALSE. Вы можете настроить следующие параметры:

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
0
ответ дан MAULIK MODI 21 August 2018 в 01:17
поделиться
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

Редактировать: вы также можете передать конструктор DateTimeZone в DateTime (), чтобы гарантировать создание даты для требуемого часового пояса, а не для сервера по умолчанию.

19
ответ дан N.B. 21 August 2018 в 01:17
поделиться
  • 1
    Я считаю, что это вызовет исключение, потому что 16-й месяц недействителен. – Matthew 4 June 2011 в 21:25
  • 2
    Важно указать, что класс php DateTime доступен с PHP версии 5.2 и getTimestamp , так как 5.3 – Diego Alcántara 23 September 2013 в 20:08

Если вы используете PHP 5.2 или high, используйте DateTime, как указано выше. Эта статья поможет.

3
ответ дан Rochadsouza 21 August 2018 в 01:17
поделиться

Чтобы проанализировать дату, вы должны использовать: DateTime :: createFromFormat ();

Пример:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

Однако, осторожно, потому что это сработает с:

PHP Fatal error: Call to a member function format() on a non-object 

Вам действительно нужно проверить, что форматирование прошло хорошо, сначала:

$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
    throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");

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

$ dateDE имеет неправильный формат, он должен быть «16.10.2013»;

21
ответ дан user2707671 21 August 2018 в 01:17
поделиться
  • 1
    Обратите внимание, что проверка $ dateObj таким образом будет только предусматривать, что формат соответствует маске, а не то, что дата действительно действительна. Например, такая дата, как 99/99/2010, будет проходить эту проверку, так как она соответствует m / d / Y, но это не дата, которую вы обычно хотите разрешить. Этот ответ решает эту ситуацию - & gt; stackoverflow.com/a/10120725/995014 – Kilian Perdomo Curbelo 23 January 2018 в 13:19

Для первой даты

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

Для новой даты

$_newDate = date("Y-m-d",strtotime($_yourDateString));
1
ответ дан Vi8L 21 August 2018 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: