আমি কীভাবে পিএইচপি 5.2.8 এ দুটি ডেটটাইম অবজেক্টের তুলনা করব?


294

পিএইচপি ডকুমেন্টেশনে এক নজর রেখে, DateTimeঅবজেক্টের নিম্নলিখিত দুটি পদ্ধতি উভয়ই আমার সমস্যার সমাধান করবে বলে মনে হচ্ছে:

এই দুটি পদ্ধতিই ডকোতে সংস্করণ> = 5.3 এ উপলব্ধ হিসাবে চিহ্নিত হয়েছে (এবং অবাক হওয়ার মতো নয়, যদি আমি তাদের কল করার চেষ্টা করি তবে সেগুলির অস্তিত্ব নেই)। আমি 5.2.8 এর জন্য কোনও নির্দিষ্ট নথিপত্র পাই না সুতরাং আমার সংস্করণে সমতুল্য পদ্ধতি আছে কিনা তা সম্পর্কে আমি নিশ্চিত নই। আমি সমস্যাটি গুগল করে দিয়েছি এবং এর সমাধানের একটি সারগ্রাহী পরিসীমা পেয়েছি, যার কোনোটাই আমার খুব সাধারণ প্রয়োজনীয়তার উত্তর দেয় না:

  • আমি কীভাবে দুটি ডেটটাইম অবজেক্টের তুলনা করব?
  • পূর্ববর্তী পিএইচপি সংস্করণগুলির জন্য ডকোটি কোথায় খুঁজে পাব? বিশেষত সংস্করণ 5.2.8?

কিছু প্রসঙ্গে, আমার কাছে নিম্নলিখিত কোড রয়েছে:

$st_dt = new DateTime(verifyParam ('start_date'));
$end_dt = new DateTime(verifyParam ('end_date'));

// is the end date more ancient than the start date?
if ($end_dt < $start_dt) 

স্পষ্টতই এই লোকটির তুলনায় কোনও তুলনামূলক অপারেটর নেই।

সম্পাদন করা

স্পষ্টতই আমার অনুমানগুলি সম্পূর্ণ মিথ্যা ছিল (এটি এত কার্যকরভাবে চিত্রিত করার জন্য মাইলেনকে ধন্যবাদ)। একটি তুলনা অপারেটর আছে এবং এটি ঠিক আছে ধন্যবাদ ধন্যবাদ। কখনও কখনও আমি সত্যিই একটি সংকলক মিস করি। বাগটি উপরের কোডটিতে রয়েছে, আমি নিশ্চিত যে আপনি এটি আমার চেয়ে অনেক দ্রুত খুঁজে পেয়েছেন :)।


1
সংকলকের অভাবের বিষয়ে - "ত্রুটি_বর্ধনা" "" E_ALL "তে সেট করুন এবং আপনি" বিজ্ঞপ্তি: অপরিবর্তিত ভেরিয়েবল: স্টার্ট_ডেট ইন ... "এর মতো নোটিশ পাবেন।
মাইলেন এ রাদেব

5
এছাড়াও, দয়া করে, আপনার বারে htmlentities ব্যবহার করুন $_POST, বা বিড়ালছানা হত্যা করা হবে।
ক্লিমেন্ট হেরেম্যান

2
আর ত্রুটি কোথায়? : পি, আমি খুব ইউ_উ করছি। আগাম ধন্যবাদ!
কাস্টার্কো

2
@ কাস্টার্কো আমি প্রাথমিকভাবে $ স্ট_ডিটি শুরু করি, তবে আমি একটি অবিরাম-স্টার্ট_ডিটির তুলনা করি। আপনার পরিবর্তনশীল নামগুলি পরীক্ষা করুন এবং সম্ভবত মাইলেনের পরামর্শ অনুসরণ করুন এবং অপরিবর্তিত ভেরিয়েবল সতর্কতাগুলি পেতে E_ALL এ ত্রুটি_বিন্যাস সেট করুন। :)
রেড ব্লুথিং

উত্তর:


432

নীচে ডেটটাইম শ্রেণীর জন্য তুলনামূলক অপারেটর রয়েছে তা নিশ্চিত করে মনে হচ্ছে:

dev:~# php
<?php
date_default_timezone_set('Europe/London');

$d1 = new DateTime('2008-08-03 14:52:10');
$d2 = new DateTime('2008-01-03 11:11:10');
var_dump($d1 == $d2);
var_dump($d1 > $d2);
var_dump($d1 < $d2);
?>
bool(false)
bool(true)
bool(false)
dev:~# php -v
PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 20:09:03)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
dev:~#

7
ধন্যবাদ মাইলেন, দেখে মনে হচ্ছে যে আমার কেবল আমার মিথ্যা অনুমানগুলি অপসারণ করা দরকার ছিল এবং হঠাৎ আমার কোডে সুস্পষ্ট বাগটি আমার কাছে স্পষ্ট হয়ে উঠল।
রেড ব্লুথিং

2
হুঁ, এটি আকর্ষণীয়। হয়তো কোনও সময়ে আমরা ব্যবহারকারী সংজ্ঞায়িত ক্লাসে অপারেটরগুলি ওভারলোড করতে সক্ষম হব।
আয়নু জি স্টান

1
Php.net/manual/en/language.operators.compistance.php থেকে অন্তর্নির্মিত ক্লাসগুলি তার নিজস্ব তুলনা সংজ্ঞায়িত করতে পারে, বিভিন্ন ক্লাস অপ্রয়োজনীয়, একই শ্রেণি - বৈশিষ্ট্যগুলির সাথে অ্যারে (পিএইচপি 4) হিসাবে একইভাবে তুলনা করে, পিএইচপি 5 এর রয়েছে নিজের ব্যাখ্যা
সাউল

7
ডেটটাইমের তুলনা করার সময় নজর রাখুন কোনও ঘন্টা সেট না করে এবং এটির সাথে একটি সেট (ডিফল্ট কনস্ট্রাক্টর)
সর্বোচ্চ 4

1
টিএমইএসপিলেটর, আমি বিশ্বাস করি যে সতর্কতাটি হ'ল আপনি যদি কেবল তারিখের তুলনা করতে আগ্রহী হন তবে আপনি এই বিষয়টিকে উপেক্ষা করতে পারেন যে সময়গুলি আলাদা, এবং এইভাবে DateTimeএকই তারিখের সাথে দু'জনকে সমান হিসাবে তুলনা করা হবে না যখন আপনি বিশ্বাস করেন যে তাদের উচিত। আপনি অবজেক্টের সময়ের উপাদানগুলি তুলনা করার আগে স্পষ্টভাবে শূন্যে সেট করে এটি প্রতিকার করতে পারেন।
জেসন

52

থেকে সরকারী ডকুমেন্টেশন :

পিএইচপি 5.2.2 হিসাবে, ডেটটাইম অবজেক্টগুলি তুলনা অপারেটরগুলি ব্যবহার করে তুলনা করা যেতে পারে ।

$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2); // false
var_dump($date1 < $date2); // true
var_dump($date1 > $date2); // false

5.2.2 আগে পিএইচপি সংস্করণে (আসলে কোনো সংস্করণ জন্য) জন্য, আপনি ব্যবহার করতে পারেন পরিবর্তন

$datetime1 = new DateTime('2009-10-11'); // 11 October 2013
$datetime2 = new DateTime('2009-10-13'); // 13 October 2013

$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days'); // +2 days

3
আমি এই উত্তরটি সবচেয়ে ভাল খুঁজে পাচ্ছি কারণ এটি কেবল আচরণটি যাচাইয়ের পরিবর্তে ম্যানুয়ালটিকে উদ্ধৃত করে এবং ফলাফলটি প্রত্যাশার মতো অনুমান করে। অনুমান করার জন্য এসও কোনও জায়গা নয়। ব্রাভো রবার্তো
সিআরপিএন


30

আপনি যুগের সেকেন্ডও তুলনা করতে পারেন:

$d1->format('U') < $d2->format('U')

সূত্র: http://laughingmeme.org/2007/02/27/loking-at-php5s-datetime-and-datetimezone/ (ডেটটাইম সম্পর্কে বেশ আকর্ষণীয় নিবন্ধ)


16
সাবধান যে formatএকটি স্ট্রিং উত্পাদন করে , তাই এটি একটি স্ট্রিং তুলনা। এটি 1000000000 যুগের পরে (প্রায় 9 ই সেপ্টেম্বর, 2001) সবেমাত্র একটি সমস্যা, তবে আপনাকে যদি তার আগে তারিখগুলি মোকাবেলা করতে হয় তবে বিভিন্ন সংখ্যা দৈর্ঘ্যের কারণে আপনি সমস্যার সম্মুখীন হতে পারেন। হয় ফলাফলগুলিকে সংখ্যায় রূপান্তর করুন (সেগুলি বিয়োগ করে খুব বেশি কাজ করে), বা সত্যই বাছাইযোগ্য বিন্যাস ব্যবহার করুন c
ম্যাক্সআর্ট

1
@ ম্যাক্সআর্ট আপনি কি বিভিন্ন স্ট্রিং দৈর্ঘ্যের কারণে সমস্যাগুলি বিস্তারিতভাবে বর্ণনা করতে পারেন? সংখ্যা সংক্রান্ত প্রসঙ্গে স্ট্রিং সম্পর্কিত ম্যানুয়াল: "যদি স্ট্রিংটিতে অক্ষর থাকে না তবে '।', 'ই', বা 'ই' এবং সংখ্যার মানটি পূর্ণসংখ্যার টাইপ সীমাতে (পিএইচপিএনপিএএমএএমএক্স দ্বারা সংজ্ঞায়িত) ফিট করে, স্ট্রিংটি একটি পূর্ণসংখ্যা হিসাবে মূল্যায়ন করা হবে other অন্য সমস্ত ক্ষেত্রে এটি একটি ভাসমান হিসাবে মূল্যায়ন করা হবে। ভবিষ্যতের তারিখগুলি (প্রায় 2038) স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার উপচে পড়তে পারে তবে পুরানো তারিখগুলির সাথে সমস্যাটি কী?
অ্যাড্রিয়ান গন্টার

1
@ অ্যাড্রিয়ানগ্যান্টার সমস্যাটি হ'ল আমরা সংখ্যার প্রেক্ষাপটে থাকব না তবে আমরা স্ট্রিংগুলি নিয়ে কাজ করব । সংখ্যাযুক্ত, কিন্তু এখনও স্ট্রিং। সুতরাং একটি স্ট্রিং তুলনা করা হবে।
ম্যাক্সআর্ট


2
@ ফ্রাডেরিক মার্চাল হ্যাঁ, আমি সত্যই পরে জানতে পেরেছিলাম যে আমার আগের মন্তব্যটি আসলে মিথ্যা। পিএইচপি-র এই কেসগুলির চিকিত্সা করার জন্য সত্যই একটি দুষ্ট উপায় আছে, যখন আপনার সাথে তুলনা করার জন্য দুটি স্ট্রিং থাকে তখন অন্য কোনও ভাষা (যেমন আমি জানি) কাস্টে না। আপনি যদি আসলে একটি অভিধান সংক্রান্ত তুলনা করতে চান তবে এটি সত্যিই আপনার কোডটিকে স্ক্রু করে।
ম্যাক্সআর্ট

20

আপনি যদি সময়গুলি না করে তারিখগুলি তুলনা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

$d1->format("Y-m-d") == $d2->format("Y-m-d")

5
আপনি পুনরায় সেট করার সময়ও সেট করতে পারেন। $d1->setTime(0, 0, 0);
অ্যাথলান

3

পিএইচপি 7.x হিসাবে, আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

$aDate = new \DateTime('@'.(time()));
$bDate = new \DateTime('@'.(time() - 3600));

$aDate <=> $bDate; // => 1, `$aDate` is newer than `$bDate`

0
$elapsed = '2592000';
// Time in the past
$time_past = '2014-07-16 11:35:33';
$time_past = strtotime($time_past);

// Add a month to that time
$time_past = $time_past + $elapsed;

// Time NOW
$time_now = time();

// Check if its been a month since time past
if($time_past > $time_now){
    echo 'Hasnt been a month';    
}else{
    echo 'Been longer than a month';
}

টাইমস্ট্যাম্পটির কিছু সীমাবদ্ধতা রয়েছে, আপনি এই স্ট্যাকওভারফ্লো.com
স্টিল ব্রেন

জেনে ভালো লাগল! এটি কেবল সময়ের সাথে তুলনা করার সহজ উপায়ের জন্য বোঝানো হয়েছিল।
কাইল কুটস

-1

এটি আপনাকে সাহায্য করতে পারে।

$today = date("m-d-Y H:i:s");
$thisMonth =date("m");
$thisYear = date("y");
$expectedDate = ($thisMonth+1)."-08-$thisYear 23:58:00";


if (strtotime($expectedDate) > strtotime($today)) {
    echo "Expected date is greater then current date";
    return ;
} else
{
 echo "Expected date is lesser then current date";
}

টাইমস্ট্যাম্পটির কিছু সীমাবদ্ধতা রয়েছে, আপনি এই স্ট্যাকওভারফ্লো.com
স্টিল ব্রেন

@ স্টিলব্রেন আপনি কি মনে করেন যে টাইমস্ট্যাম্প সীমাবদ্ধতা কোডের উপরে যে সমস্ত বর্তমান তারিখ রয়েছে তার চেয়ে বেশি বিরক্ত করে, দয়া করে কোডটি আবার পড়ুন, এটি মূলত লোকটির প্রত্যাশিত তারিখটি যাচাই করে রাখে যা চলতি মাসে থাকবে। আমি মনে করি না তাই এই ক্ষেত্রে আমাদের এখানে টাইমস্ট্যাম্প সীমাবদ্ধতা সম্পর্কে চিন্তা করা উচিত।
তরুণ গুপ্ত

আমি জানি, তবে এটি কোনও প্রস্তাবিত উপায় নয়, (আমি ছাড়িনি :-))
ইস্পাত মস্তিষ্ক

আপনি কি প্রস্তাবিত উপায় প্রস্তাব করতে পারেন?
তরুণ গুপ্ত

নিশ্চিত, $today = new DateTime("now"); $time = DateTime::createFromFormat('d-m-Y',"26-October-1998"); if ($today > $time){echo "today is greater";}else{echo "other time is greater";}চিয়ার্স
ইস্পাত মস্তিষ্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.