2012-05-08 17 views
6

Tôi có thời gian lưu trong cơ sở dữ liệu như 7:30 chiều như một trường varchar. Tôi muốn kiểm tra xem thời gian này có lớn hơn thời gian ngay bây giờ hay không.PHP: Cách so sánh chuỗi thời gian với ngày ('H: i')?

tôi chuyển đổi chuỗi thời gian DB vào '19: 30' và bây giờ tôi muốn làm một cái gì đó như thế này:

$my_time = '19:30'; 

if($my_time > date('H:i')) 
{ 
    do something ... 
} 

Vấn đề là ở trên sẽ trở lại luôn luôn đúng nếu $ my_time không bị để trống chuỗi .

đang thực hiện strtotime($my_time) cũng không giúp ích gì.

strtotime('H:i',$my_time) làm cho nó 00:00.

làm (int)date('H:i') sẽ cho 1700 khi thời gian thực tế là 17:09, do đó loại bỏ ruột và sau đó so sánh sẽ không làm việc quá ....

Thay đổi dữ liệu thời gian cơ sở dữ liệu nằm ngoài câu hỏi trong bối cảnh này.

trợ giúp plz. Sửa tôi nếu tôi nói một số sự kiện sai.

+0

Bạn nên sử dụng trường ngày giờ nguyên bản thay vì varchar. Nó sẽ giải quyết vấn đề này cho bạn. –

+0

http://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 –

+0

tôi biết John ... đó là vấn đề lớn nhất. –

Trả lời

7

Bạn có thể sử dụng này:

$myTime = '19:30'; 
if (date('H:i') == date('H:i', strtotime($myTime))) { 
    // do something 
} 
+0

ya it works ... thanks –

+0

m sử dụng cái này .. –

+4

Rất nhiều thời gian đã trôi qua, nhưng không phải là nó giống như so sánh trực tiếp hai chuỗi? Vì 'date()' trả về một chuỗi, nó chính xác như đang làm: 'if (date ('H: i') == '19: 30 ')' phải không ?, đó là điều tương tự như OP đã đề cập cố gắng. Đó là vì 'date ('H: i', strtotime ($ myTime))' trả về giá trị $ myTime ban đầu dưới dạng chuỗi !!! Vì vậy, nó là giống như chỉ cần đặt '$ myTime' thay vì' ngày ('H: i', strtotime ($ myTime)) '.so điểm là gì? Tôi thực sự không hiểu. Tôi đang thiếu gì? Tại sao 'if ($ my_time> date ('H: i'))' OP được cho là không hoạt động? bởi vì nó làm việc cho tôi. – DiegoDD

2

Bạn không thể sử dụng toán tử so sánh với chuỗi như vậy, bởi vì khi bạn thực hiện các chuỗi get converted to numbers first.

Đối với một giải pháp một liner, bạn có thể sử dụng strcmp:

if(strcmp($my_time, date('H:i')) == 1) 
{ 
    do something ... 
} 

Tình trạng trên là ngữ nghĩa tương đương với "nếu $ my_time lớn hơn thời điểm hiện tại", nhưng chỉ khi định dạng của chuỗi vẫn nhất quán!Rất dễ dàng để giới thiệu lỗi trong mã này nếu vì bất kỳ lý do nào, định dạng $my_time không trực tiếp tương ứng với mẫu H:i.

Làm giảm giá trị cho chuỗi thường không phải là cách bạn nên thực hiện khi sử dụng ngày và giờ. Một giải pháp thích hợp hơn sẽ là sử dụng lớp gốc DateTime, được giới thiệu trong PHP 5.2.0 (John Conde đã đưa ra một ví dụ trong his answer).

Tuy nhiên, cũng có một lợi thế có thể để xử lý thời gian như giá trị vô hướng câm: kết quả phù hợp với nhận thức của con người rằng 01:00 luôn muộn hơn 00:00. Các phương pháp DateTime phụ thuộc vào múi giờ địa phương và ngày tháng, và có thể không phải lúc nào cũng cung cấp cho bạn kết quả mong đợi. Ví dụ:

// assume we are in London 
date_default_timezone_set('Europe/London'); 

// assume that today is March 25, 2012 
$date1 = new DateTime("2012-03-25 01:00:00"); 
$date2 = new DateTime("2012-03-25 02:00:00"); 

// and... 
if ($date1 == $date2) { 
    echo "WTF?!? Equal???"; 
} 

See it in action.

Kết quả của thử nghiệm này khác với kết quả so sánh một số đại diện vô hướng "01:00" và "02:00", do đó, nên suy nghĩ về ngữ nghĩa phù hợp để so sánh.

+0

Hoạt động ... với múi giờ Ấn Độ, Kolkata. Tôi đoán tôi có thể sử dụng nó trên máy chủ trực tiếp. –

1
$date1 = DateTime::createFromFormat('H:i', $my_time1); 
$date2 = new DateTime(); 
if ($date1 > $date2) 
{ 
    // do something 
} 
+0

+1 và tuyên bố từ chối trách nhiệm bắt buộc: Kết quả của thử nghiệm này có thể gây ngạc nhiên cho các giá trị cụ thể tùy thuộc vào ngày và múi giờ hiện tại. – Jon

+0

Tôi nhận được lỗi sau: Lỗi nghiêm trọng: Uncaught exception 'Exception' với thông báo 'DateTime :: __ construct() [datetime.--construct]: Không phân tích chuỗi thời gian (H: i) tại vị trí 1 (:): Ký tự không mong muốn' trong C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php trên dòng ................... và tiếp theo là cảnh báo: Ngoại lệ: DateTime :: __ construct() [datetime.--construct]: Không thể phân tích chuỗi thời gian (H: i) tại vị trí 1 (:): Ký tự không mong muốn trong C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php trên dòng –

4

Bạn có thể xây dựng một đối tượng mới DateTime, thiết lập thời gian vào một ngày ngẫu nhiên. So sánh hai đối tượng đó.ví dụ:

$my_time = new DateTime('January 1th 1970 19:30'); 
$comparable_time = new DateTime('January 1th 1970 '. date('H:i')); 
if($my_time < $comparable_time) { 
    // do something 
} else { 
    // do something else 
} 

Hãy lưu ý về thay đổi;

Version 5.2.2 DateTime object comparison with the comparison operators changed to work as expected. Previously, all DateTime objects were considered equal (using ==). 
Các vấn đề liên quan