Câu trả lời:
strtotime($var);
Biến nó thành một giá trị thời gian
time() - strtotime($var);
Cung cấp cho bạn những giây kể từ khi $var
if((time()-(60*60*24)) < strtotime($var))
Sẽ kiểm tra nếu $var
đã được trong ngày cuối cùng.
Định dạng đó là hoàn toàn phù hợp để so sánh chuỗi tiêu chuẩn, ví dụ
if ($date1 > $date2){
//Action
}
Để có được ngày hôm nay trong định dạng đó, chỉ cần sử dụng : date("Y-m-d H:i:s")
.
Vì thế:
$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";
if ($date < $today) {}
Đó là vẻ đẹp của định dạng đó: nó đặt hàng độc đáo. Tất nhiên, điều đó có thể kém hiệu quả hơn, tùy thuộc vào hoàn cảnh chính xác của bạn, nhưng nó cũng có thể thuận tiện hơn rất nhiều và dẫn đến mã dễ bảo trì hơn - chúng ta cần biết nhiều hơn để thực hiện cuộc gọi phán xét đó.
Đối với múi giờ chính xác, bạn có thể sử dụng, ví dụ:
date_default_timezone_set('America/New_York');
Nhấn vào đây để tham khảo các múi giờ PHP có sẵn.
mm/dd/yyyy
định dạng thành ngày và sau đó so sánh nó. Nó luôn làm tôi lo lắng khi các nhà phát triển có ngày ở nhiều múi giờ trong hệ thống của họ. Tôi nghĩ sẽ tốt hơn nếu lưu trữ ngày trong hệ thống của bạn, luôn ở múi giờ đơn và sau đó hiển thị nó theo bất kỳ múi giờ nào. Tôi bắt đầu sử dụng yyyy-mm-dd
định dạng (hoặc yyyymmdd
) vào khoảng năm 1998 khi tôi nhận ra nó sắp xếp nhanh hơn rất nhiều ngay cả trong máy chủ SQL.
Ở đây bạn đi:
function isToday($time) // midnight second
{
return (strtotime($time) === strtotime('today'));
}
isToday('2010-01-22 00:00:00.0'); // true
Ngoài ra, một số chức năng trợ giúp khác:
function isPast($time)
{
return (strtotime($time) < time());
}
function isFuture($time)
{
return (strtotime($time) > time());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
và điều đó đã giúp tôi.
Để hoàn thành BoBby Jack, sử dụng OBject DateTime, nếu bạn có php 5.2.2+:
if(new DateTime() > new DateTime($var)){
// $var is before today so use it
}
Bạn có thể sử dụng DateTime
lớp:
$past = new DateTime("2010-01-01 00:00:00");
$now = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");
Toán tử so sánh hoạt động *:
var_dump($past < $now); // bool(true)
var_dump($future < $now); // bool(false)
var_dump($now == $past); // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future); // bool(false)
var_dump($past > $now); // bool(false)
var_dump($future > $now); // bool(true)
Cũng có thể lấy các giá trị dấu thời gian từ các đối tượng DateTime và so sánh chúng:
var_dump($past ->getTimestamp()); // int(1262286000)
var_dump($now ->getTimestamp()); // int(1431686228)
var_dump($future->getTimestamp()); // int(1577818800)
var_dump($past ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)
* Lưu ý rằng ===
trả về false khi so sánh hai đối tượng DateTime khác nhau ngay cả khi chúng đại diện cho cùng một ngày.
$future
đã trở thành quá khứ. : P
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');
var_dump(strtotime($today) > strtotime($expiry)); //false or true
$var
bằng trong OP
Một lưu ý dựa trên kinh nghiệm của tôi, nếu mục đích của bạn chỉ liên quan đến ngày thì hãy cẩn thận để bao gồm dấu thời gian . Ví dụ, nói hôm nay là "2016-11-09"
. So sánh liên quan đến dấu thời gian sẽ vô hiệu hóa logic ở đây. Thí dụ,
// input
$var = "2016-11-09 00:00:00.0";
// check if date is today or in the future
if ( time() <= strtotime($var) )
{
// This seems right, but if it's ONLY date you are after
// then the code might treat $var as past depending on
// the time.
}
Mã ở trên có vẻ đúng, nhưng nếu CHỈ là ngày bạn muốn so sánh, thì mã ở trên không phải là logic đúng. Tại sao? Bởi vì, time () và strtotime () sẽ cung cấp bao gồm dấu thời gian. Đó là, mặc dù cả hai ngày rơi vào cùng một ngày, nhưng sự khác biệt về thời gian sẽ có vấn đề. Hãy xem xét ví dụ dưới đây:
// plain date string
$input = "2016-11-09";
Bởi vì đầu vào là chuỗi ngày đơn giản, sử dụng strtotime()
vào $input
sẽ cho rằng đó là nửa đêm của ngày 2016-11-09. Vì vậy, chạy time()
bất cứ lúc nào sau nửa đêm sẽ luôn coi $input
là quá khứ, mặc dù chúng ở cùng một ngày.
Để sửa lỗi này, bạn có thể chỉ cần mã, như thế này:
if (date("Y-m-d") <= $input)
{
echo "Input date is equal to or greater than today.";
}
Vài năm sau, tôi quan sát lần thứ hai của Bobby Jack rằng 24 giờ qua không phải là hôm nay !!! Và tôi ngạc nhiên rằng câu trả lời đã được đưa ra rất nhiều ...
Để so sánh nếu một ngày nhất định là ít hơn, bằng hoặc lớn hơn một ngày khác, trước tiên bạn cần phải biến chúng "xuống" thành đầu ngày. Nói cách khác, đảm bảo rằng bạn đang nói về cùng một thời gian 00:00:00 trong cả hai ngày. Điều này có thể được thực hiện đơn giản và thanh lịch như:
strtotime("today") <=> strtotime($var)
nếu $var
có phần thời gian vào 00:00:00 như OP đã chỉ định.
Thay thế <=>
bằng bất cứ thứ gì bạn cần (hoặc giữ nó như thế này trong php 7)
Ngoài ra, rõ ràng, chúng ta đang nói về cùng múi giờ cho cả hai. Để biết danh sách các múi giờ được hỗ trợ
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(ví dụ w3schools, nó hoạt động hoàn hảo)
Mở rộng câu trả lời của Josua từ w3schools:
//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0) {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}
Tôi hi vọng cái này giúp được. Bài viết đầu tiên của tôi trên stackoverflow!
So sánh các đối tượng thời gian ngày:
(Tôi đã chọn 10 ngày - Mọi thứ cũ hơn 10 ngày là "OLD", khác "MỚI")
$now = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
echo "OLD! " . $yourdate->format('m/d/Y');
}else{
echo "NEW! " . $yourdate->format('m/d/Y');
}
Một số câu trả lời không được xem xét trong ngày hiện tại!
Đây là đề xuất của tôi.
$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);
if ($given_date == new \DateTime('today')) {
//today
}
if ($given_date < new \DateTime('today')) {
//past
}
if ($given_date > new \DateTime('today')) {
//future
}
Nếu bạn làm mọi việc với thời gian và ngày tháng, Carbon là người bạn tốt nhất của bạn;
Cài đặt gói sau đó:
$theDay = Carbon::make("2010-01-21 00:00:00.0");
$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))
lt = ít hơn, gt = lớn hơn
Như trong câu hỏi:
$theDay->gt(Carbon::today()) ? true : false;
và nhiều hơn nữa;