2012-06-14 68 views
33

Tôi đang cố gắng viết một hàm để xác định xem chuỗi có phải là ngày/giờ sử dụng PHP hay không. Về cơ bản một ngày/giờ hợp lệ sẽ trông như thế:Chức năng kiểm tra xem chuỗi có phải là ngày

2012-06-14 01:46:28 

Rõ ràng mặc dù nó hoàn toàn động bất kỳ giá trị có thể thay đổi, nhưng nó phải luôn luôn ở trong hình thức XXXX-XX-XX XX:XX:XX, làm thế nào tôi có thể viết một biểu thức chính quy để kiểm tra này và trả về true nếu phù hợp.

+2

Có thể dupli cate: http://stackoverflow.com/questions/37732/what-is-the-regex-pattern-for-datetime-2008-09-01-123545 – Fabian

Trả lời

56

Nếu đó là toàn bộ chuỗi của bạn, sau đó chỉ cần thử phân tích cú pháp:

if (DateTime::createFromFormat('Y-m-d G:i:s', $myString) !== FALSE) { 
    // it's a date 
} 
+4

Đây không phải là giải pháp. Tôi có 'DateTime :: createFromFormat ('m/d/Y', '10/38/2013 ')' và tạo ra một đối tượng DateTime hợp lệ và không sai. Ngày được chuyển thành 'đối tượng (DateTime) # 39 (3) { [" ngày "] => chuỗi (19)" 2013-11-07 23:45:55 " [" timezone_type "] => int (3) ["múi giờ"] => chuỗi (3) "UTC" } ' – cj5

+1

Yikes. Tôi thích những điều này không bao giờ được chỉ ra trong tài liệu ... Bạn không tìm thấy một giải pháp thay thế? (Chỉnh sửa: [Định dạng ngày tháng] (http://www.php.net/manual/en/datetime.formats.date.php) tài liệu mà bạn có thể quá/tháng và tháng, nhưng không đưa ra gợi ý gì được thực hiện khi bạn * không * muốn hành vi đó – Joey

+0

Được rồi, không có giải pháp hay cài đặt nào để ghi đè điều này trong PHP. Tôi đã lưu ý một giải pháp trong các câu trả lời http://stackoverflow.com/a/19666600/486863 – cj5

4

Tôi sử dụng chức năng này làm tham số cho hàm PHP filter_var.

  • Nó kiểm tra cho những ngày ở định dạng yyyy-mm-dd hh:mm:ss
  • Nó bác bỏ ngày phù hợp với mô hình nhưng vẫn không hợp lệ (ví dụ Apr 31)

function filter_mydate($s) { 
    if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)[email protected]', $s, $m) == false) { 
     return false; 
    } 
    if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) { 
     return false; 
    } 
    return $s; 
} 
+5

^(\ d {4} (?: \ - \ d {2}) {2} \ d {2} (?: \: \ D {2}) {2}) $ – kioopi

1

tôi sẽ không sử dụng một Regex cho điều này, nhưng thay vì chỉ chia chuỗi và kiểm tra xem ngày là hợp lệ:

list($year, $month, $day, $hour, $minute, $second) = preg_split('%(|-|:)%', $mydatestring); 
if(!checkdate($month, $day, $year)) { 
    /* print error */ 
} 
/* check $hour, $minute and $second etc */ 
20

Dưới đây là một cách tiếp cận khác nhau mà không sử dụng một regex:

function check_your_datetime($x) { 
    return (date('Y-m-d H:i:s', strtotime($x)) == $x); 
} 
+1

Điều này thật tuyệt, nhờ –

0

Nếu trái tim của bạn được thiết lập về việc sử dụng regex sau đó txt2re.com luôn luôn là một nguồn lực tốt:

<?php 

    $txt='2012-06-14 01:46:28'; 
    $re1='((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))'; # Time Stamp 1 

    if ($c=preg_match_all ("/".$re1."/is", $txt, $matches)) 
    { 
     $timestamp1=$matches[1][0]; 
     print "($timestamp1) \n"; 
    } 

?> 
2

Mặc dù đây đã là một câu trả lời được chấp nhận, nó sẽ không có hiệu quả làm việc trong tất cả các trường hợp. Ví dụ, tôi kiểm tra xác nhận ngày trên một trường biểu mẫu Tôi đã sử dụng ngày "10/38/2013" và tôi nhận được DateObject hợp lệ được trả về, nhưng ngày đó là PHP gọi là "tràn", để "10/38/2013 "trở thành" ngày 11/07/2013 ". Làm cho tinh thần, nhưng chúng ta nên chỉ chấp nhận ngày cải cách, hoặc buộc người dùng phải nhập ngày chính xác? Đối với những người trong chúng ta, những người được hình thức xác nhận nazis, Chúng tôi có thể sử dụng sửa chữa bẩn này: https://stackoverflow.com/a/10120725/486863 và chỉ trả về false khi đối tượng ném cảnh báo này.

Cách giải quyết khác sẽ khớp với ngày chuỗi thành ngày được định dạng và so sánh hai giá trị này với giá trị bằng nhau. Điều này có vẻ như là lộn xộn. Oh well. Đó là bản chất của PHP dev.

0
function validateDate($date, $format = 'Y-m-d H:i:s') 
{  
    $d = DateTime::createFromFormat($format, $date);  
    return $d && $d->format($format) == $date; 
} 

chức năng đã được sao chép từ này answer hoặc php.net

0

Nếu bạn có câu trả lời PHP 5.2 Joey sẽ không hoạt động.Bạn cần phải mở rộng lớp DateTime PHP:

class ExDateTime extends DateTime{ 
    public static function createFromFormat($frmt,$time,$timezone=null){ 
     $v = explode('.', phpversion()); 
     if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get()); 
     if(((int)$v[0]>=5&&(int)$v[1]>=2&&(int)$v[2]>17)){ 
      return parent::createFromFormat($frmt,$time,$timezone); 
     } 
     return new DateTime(date($frmt, strtotime($time)), $timezone); 
    } 
} 

và hơn bạn có thể sử dụng lớp này mà không có vấn đề:

ExDateTime::createFromFormat('d.m.Y G:i',$timevar); 
11

Trong trường hợp bạn không biết định dạng ngày:

/** 
* Check if the value is a valid date 
* 
* @param mixed $value 
* 
* @return boolean 
*/ 
function isDate($value) 
{ 
    if (!$value) { 
     return false; 
    } 

    try { 
     new \DateTime($value); 
     return true; 
    } catch (\Exception $e) { 
     return false; 
    } 
} 

var_dump(isDate('2017-01-06')); // true 
var_dump(isDate('2017-13-06')); // false 
var_dump(isDate('2017-02-06T04:20:33')); // true 
var_dump(isDate('2017/02/06')); // true 
var_dump(isDate('3.6. 2017')); // true 
var_dump(isDate(null)); // false 
var_dump(isDate(true)); // false 
var_dump(isDate(false)); // false 
var_dump(isDate('')); // false 
var_dump(isDate(45)); // false 
+0

var_dump (isDate ('now')); // true var_dump (isDate ('tomorrow')); // true var_dump (isDate ('yesterday')); // true – Pocketsand

+1

Hãy coi chừng các số nguyên! isDate ('123456') == true và isDate (123456) == đúng – Pocketsand

0

Phiên bản nhỏ hơn, phiên bản này có thể hữu ích:

if(strtotime($date_string)){ 
    // it's in date format 
} 
Các vấn đề liên quan