Преобразовать пользовательский ввод в мой формат даты - PullRequest
2 голосов
/ 31 августа 2011

Пользователь вводит дату как 01.08.11 или 08.11.11. Независимо от того, как пользователь вводит дату в мое текстовое поле, я хочу преобразовать введенные данные в мой формат мм / дд / гггг

Таким образом, если пользователь вводит 01.08.11, он преобразует его в 08.01.2011.

Ответы [ 5 ]

2 голосов
/ 31 августа 2011

Используйте strtotime(), чтобы перевести его в значение времени, а затем mktime(), чтобы перевести его в любой формат.

РЕДАКТИРОВАТЬ: ПоворачиваетНо это не так просто.

Вы не можете просто напечатать любую дату, которую хотите, и перенести ее на другую, лучше будет использовать какой-то интерфейс на стороне клиента, чтобы обеспечить совпадение вводаОтличным примером является jQueryUI Datepicker

1 голос
/ 04 сентября 2011

Проверьте это. Он также проверяет, является ли дата действительной (с контрольной датой), и конвертирует годы из коротких в длинные. При использовании коротких лет 0-69 конвертируется в 2000-2069, а 70-99 конвертируется в 1970-1999.

<?php
function cleanDate($input)
{
    $parts = explode('/', $input);
    if(count($parts) != 3) return false;

    $month = (int)$parts[0];
    $day = (int)$parts[1];
    $year = (int)$parts[2];

    if($year < 100)
    {
        if($year < 70)
        {
            $year += 2000;
        }
        else
        {
            $year += 1900;
        }
    }

    if(!checkdate($month, $day, $year)) return false;

    return sprintf('%02d/%02d/%d', $month, $day, $year);
    // OR
    $time = mktime(0, 0, 0, $month, $day, $year);
    return date('m/d/Y', $time);
}

$test = array(
    '08/01/2011', '8/1/11', '08/01/11', // Should all return 08/01/2011
    '08/1/87', // Should return 08/01/1987
    '32/1/93', '13', // Should fail: invalid dates
    '02/29/2011', // Should fail: 2011 is not a leap year
    '2/29/08'); // Should return 02/29/2008 (2008 is a leap year)
foreach($test as $t)
{
    echo $t.' : '.(cleanDate($t) ?: 'false')."\n";
}
?>

Result:
08/01/2011 : 08/01/2011
8/1/11 : 08/01/2011
08/01/11 : 08/01/2011
08/1/87 : 08/01/1987
32/1/93 : false
13 : false
02/29/2011 : false
2/29/08 : 02/29/2008
1 голос
/ 31 августа 2011
<?php

$userInput = '08/1/11';  // or = '8/1/11' or  = '08/01/11' or = '01/8/11'

$arr = explode('/', $userInput);

$formatted = sprintf("%1$02d", $arr[0]) . '/' . sprintf("%1$02d", $arr[1]) . '/20' . $arr[2];

?>
0 голосов
/ 27 июля 2012

Несмотря на то, что @Truth прав в том, что пользователь может многое сделать, чтобы сделать его трудным, на самом деле существует способ сделать довольно приличную работу по синтаксическому анализу поля ввода даты для работы. Принимается во внимание ряд проблем с пользовательским вводом, которые могут возникнуть.

Обратите внимание, что он делает два предположения:

что местный использует формат даты м / д / у
Если год введен в краткой форме, мы имеем дело с 2000+ годом

<?php  
    // Trim spaces from beginning/end  
    $date = trim(request($field));  
    // Allow for the user to have separated by spaces  
    $date = str_replace(" ", "/", $date);  
    // Allow for the user to have separated by dashes or periods  
    $date = str_replace("-", "/", str_replace(".", "/", trim($date)));  
    // Explode the date parts out to ensure a year  
    // Granted, this is geo-centric - you could adjust based on your locale  
    $dateparts = explode("/", $date);  
    // Check for a year.  If not entered, assume this year  
    if (!isset($dateparts[2])) {$dateparts[2] = date("Y");}  
    // Force year to integer for comparison  
    $dateparts[2] = (int)$dateparts[2];  
    // Allow for user to use short year.  Assumes all dates will be in the year 2000+  
    if ($dateparts[2] < 2000) {$dateparts[2]+= 2000;}  
    // Re-assemble the date to a string  
    $date = implode("/", $dateparts);    
    // Utilize strtotime and date to convert date to standard format  
    $date = date("m/d/Y", strtotime($date));
?>

Отказ от ответственности: Да, это подробный способ сделать это, однако я сделал это для ясности примера, а не для эффективности.

0 голосов
/ 31 августа 2011
<?php
preg_match('#^(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])/(\d{2})$#',trim($date),$matches);
$month=str_pad($matches[1],2,'0',STR_PAD_LEFT);
$day=str_pad($matches[2],2,'0',STR_PAD_LEFT);
$year=$matches[3];

$result="{$month}/{$day}/{$year}";
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...