2010-01-10 2 views
6

Я разработал веб-страницу, в которой мне нужно изменить формат даты с 22/01/2010 по 2010-01-22 . Я использую следующую функцию, но получаю предупреждение как «Устаревшее: Функция ereg() отменена в c: \ wamp \ www \ testpage.php в строке 33 ". В любом случае, чтобы скрыть эту ошибку или есть ли другой способ изменить формат даты? Пожалуйста, помогите мне решить эту проблему. Спасибо заранее.изменить формат даты в php

$datedue = $_REQUEST['txtJoiningdate']; 
     $r = ereg ("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", $datedue, $redgs); 
     $billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1]; 
+0

[Для различных форматов/вариантов даты, нажмите здесь:] (http://php.net/manual/en/function.date.php) –

ответ

7

Вы используете устаревшие функции. Вместо этого используйте preg_match. Также вызов preg_match должен быть в тесте if.

<?php 
$datedue = '22/01/2010'; 
if(preg_match('@([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})@', $datedue, $redgs)) { 
    $billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1];  
    echo $billdate; // prints 2010-01-22 
} 
?> 
3

Это следует сделать это:

list($d, $m, $y) = explode('/', $datedue); 
$billdate = date('Y-m-d', mktime(0,0,0,$m,$d,$y); 

Или это может быть без функций даты, как Гамбо предложил:

list($d, $m, $y) = explode('/', $datedue); 
$billdate = "$y-$m-$d"; 

Я бы рекомендовал с помощью date, хотя, если вы подозреваете, вам нужно изменить формат в будущем. Нет необходимости использовать регулярное выражение для простого разделения. В этом случае Explode будет намного быстрее.

Функции регулярного выражения устаревают с PHP 5.3.0 и будут удалены в PHP 6. Для регулярных выражений используйте функции preg_.

Об укрытии ошибки; вы никогда не должны скрывать уведомления при разработке, поскольку они помогают вам создавать лучший код. Без этого уведомления вы бы с радостью использовали ereg, и ваше приложение сильно сломалось, когда сервер будет обновлен до PHP 6. Но вы можете контролировать количество отображаемых ошибок с помощью error_reporting(). Поведение error_reporting, когда ваш сайт идет в прямом эфире, может быть хорошей идеей.

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

+1

Использование 'date' и 'mktime' не требуется. Простая обработка строк будет достаточной. – Gumbo

+0

@Gumbo, используя дату (как я и предложил), предлагает большую гибкость для изменения формата даты в будущем, без необходимости переупорядочивать или перерабатывать строку. – johnnyArt

3

Используйте PCRE функции preg_match или preg_replace вместо:

$billdate = preg_replace('~([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})~', '$3-$2-$1', $datedue); 

Но вы также можете использовать комбинацию explode, array_reverse и implode:

$billdate = implode('-', array_reverse(explode('/', $datedue))); 
+0

+1: Это аккуратно :) – gameover

+0

В чем причина нисходящего? – Gumbo

3

С последними версиями PHP, POSIX regex functions действительно устарела - вы должны прекратить использовать их, и использовать preg_* функции вместо.


Вот ваш код, переписанный с использованием preg_match:

preg_match("#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#", '22/01/2010', $redgs); 
$billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1]; 
var_dump($billdate); 

И вы получите:

$ /usr/local/php-5.3/bin/php temp.php 
string(10) "2010-01-22" 


Чтобы быть более точным, со ссылкой на документацию ereg:

Эта функция была DEPRECATED с PHP 5.3.0 и УДАЛЕННЫЙ от PHP 6.0.0. Опираясь на эту функцию, очень обескуражен.

Итак, не стесняйтесь ознакомиться с документацией Regular Expressions (Perl-Compatible) - которые являются более мощными, быстрее, ... чем POSIX.

11

Почему бы не использовать strtotime, date и str_replace функции, родные для php, чтобы сделать трюк в одной простой строке?

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

echo date('Y-m-d',strtotime(str_replace("/",".","22/01/2010"))); 

Выходы 2010-01-22

Документация для функций используется:

1
<?php 
list($day, $month, $year) = split('/', $_REQUEST['txtJoiningdate']); // 22/01/2010 
$new_date = "$year-$month-$day"; // $new_date now equals 2010-01-22 
?> 
1
$date = '01/24/2006'; 
echo date('Y-m-d', strtotime($date)); // outputs 2006-01-24 
0
if (! function_exists('changeDateFormat')) 
{ 
    function changeDateFormat($original) 
    { 
     //$original = '2015-08-10'; 
     // 2015-08-10 to 10-08-2015 
     $exploded = explode("-", $original); 
     $exploded = array_reverse($exploded); 
     $newFormat = implode("-", $exploded); 
     return $newFormat; 
    } 
} 

+0

Просьба предоставить более подробную информацию. – Phiter

Смежные вопросы