জাভাস্ক্রিপ্টে সময়ের তুলনা না করে কেবল তারিখের অংশের তুলনা করা


397

নীচের কোডটিতে কী ভুল?

হয়তো সময়টি নয় কেবল তারিখের তুলনা করা সহজ হবে। এটি আমি কীভাবে করব তা সম্পর্কে নিশ্চিত নই এবং আমি অনুসন্ধান করেছিলাম তবে আমার সঠিক সমস্যাটি খুঁজে পেলাম না।

বিটিডাব্লু, আমি যখন একটি সতর্কতায় দুটি তারিখ প্রদর্শন করি তখন তারা ঠিক একইরকম প্রদর্শিত হয়।

আমার কোড:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

তারিখগুলি তুলনা করার সহজ উপায় আছে এবং সময়টি অন্তর্ভুক্ত নয়?

উত্তর:


781

আমি এখনও জাভাস্ক্রিপ্ট শিখছি, এবং আমি খুঁজে পেয়েছি যে একমাত্র উপায় যা আমার জন্য সময় ছাড়া দুটি তারিখের তুলনা করতে কাজ করে তা হ'ল setHoursতারিখ অবজেক্টের পদ্ধতিটি ব্যবহার করে এবং ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ডগুলি শূন্যে সেট করে। তারপরে দুটি তারিখের তুলনা করুন।

উদাহরণ স্বরূপ,

date1 = new Date()
date2 = new Date(2011,8,20)

date2ঘন্টা, মিনিট, সেকেন্ড এবং মিলি সেকেন্ডের সাথে শূন্যে সেট করা হবে, তবে তারিখ 1 এটিকে তারিখ 1 তৈরি হওয়ার সময় সেট করে দেবে। তারিখ 1 এ ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ডগুলি থেকে মুক্তি পাওয়ার জন্য নিম্নলিখিতটি করুন:

date1.setHours(0,0,0,0)

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


63
দয়া করে সচেতন হন যে পরীক্ষার দ্বারা date1 === date2ধারাবাহিক আচরণ সরবরাহ করা হয় না বলে মনে হয়; এটা করা date1.valueOf() === b.valueOf()বা এমনকি ভাল date1.getTime() === date2.getTime()। Strangeness।
এরউইন ওয়েসেলস

4
সতর্কতা অবলম্বন করুন: যদি তারিখ 1 এবং তারিখ 2 শীত এবং গ্রীষ্মে হয় এবং আপনি অ্যাডডেস (1) দিয়ে একে অপরের সাথে পুনরাবৃত্তি করার পরিকল্পনা করেন, সমস্যা হ'ল দিবালোক সংরক্ষণের কারণে তাদের একই টাইমজোন থাকবে না, তাই শেষ তুলনা করুন যে সমান তারিখ দেওয়া উচিত কাজ করবে না কারণ দুটি তারিখ আসলেই 00: 00: 00: 0 এ নয়।
অলিভার

9
আমি জানি এটি একটি পুরানো প্রশ্ন, তবে অনুসন্ধানের সময় এটি গুগলে প্রথমে আসে। এই উত্তরটি সম্পর্কে সতর্কতা অবলম্বন করুন। যদি ব্যবহারকারী তারিখের অবজেক্টের নির্মাতার একই সময় অঞ্চলে না থাকে তবে এটি ভুল উত্তর দেবে। উদাহরণস্বরূপ, আপনার কম্পিউটারের ওএসের টাইমজোনটি পূর্ব উপকূলের (মার্কিন) সময়তে পরিবর্তন করুন। আপনার ব্রাউজারের কনসোলটি খুলুন এবং টাইপ করুন var date2 = new Date(2011,8,20)। এখন ওএসের সময় অঞ্চলটি প্যাসিফিক সময় (মার্কিন) এ পরিবর্তন করুন। একই ব্রাউজার কনসোল টাইপ date2.toDateString()এবং আপনি Mon Sep 19 201120th মঙ্গলবার চেয়ে ফিরে পাবেন !
আদম

9
এছাড়াও নোট করুন যে setHours()বর্তমান টাইমজোনের ভিত্তিতে সময় নির্ধারণ করে যা ব্রাউজার দ্বারা স্বয়ংক্রিয়ভাবে সনাক্ত করা হয়েছিল। চেষ্টা করুন: ২৮ তারিখটি t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());মুদ্রিত হবে "2016-02-28T15:00:00.000Z", তবে ২৯ নয় আমার বর্তমান সময় অঞ্চলটি হলAsia/Tokyo
২৮

8
setUTCxxxস্থানীয় / সময় অঞ্চল সচেতন রূপগুলির পরিবর্তে পদ্ধতিগুলি ব্যবহার করতে এই উত্তরটি সত্যই আপডেট করা উচিত ।
স্টিজন ডি উইট

136

টাইমজোনটি সাবধান করুন

কেবলমাত্র এক তারিখ উপস্থাপনের জন্য ডেট অবজেক্টটি সরাসরি ব্যবহার করা আপনাকে একটি বিশাল অতিরিক্ত নির্ভুলতার সমস্যায় ফেলবে। এগুলি দূরে রাখতে আপনাকে সময় এবং সময় অঞ্চল পরিচালনা করতে হবে এবং তারা যে কোনও পদক্ষেপে পিছনে লুকিয়ে থাকতে পারে। এই প্রশ্নের গৃহীত উত্তর ফাঁদে পড়ে।

একটি জাভাস্ক্রিপ্ট তারিখের সময় অঞ্চল সম্পর্কে কোনও ধারণা নেই । এটি একটি মুহূর্ত (যুগের পর থেকে টিক্স) সাথে স্ট্রিং-এ অনুবাদ করার জন্য হ্যান্ডি (স্ট্যাটিক) ফাংশন সহ ডিফল্টরূপে ডিভাইসের "স্থানীয়" টাইমজোন ব্যবহার করে, বা নির্দিষ্ট করে বলা হয়, ইউটিসি বা অন্য কোনও টাইমজোন। একটি তারিখের অবজেক্টের সাথে সবেমাত্র-তারিখকে উপস্থাপন করতে, আপনি চান যে তারিখগুলি প্রশ্নটির তারিখের শুরুতে মধ্যরাতে ইউটিসির প্রতিনিধিত্ব করবে। এটি একটি সাধারণ এবং প্রয়োজনীয় কনভেনশন যা তাদের সৃষ্টির মরসুম বা সময় অঞ্চল নির্বিশেষে আপনাকে তারিখগুলি নিয়ে কাজ করতে দেয়। সুতরাং আপনি যখন আপনার মধ্যরাতের ইউটিসি তারিখের অবজেক্টটি তৈরি করবেন এবং যখন আপনি এটি সিরিয়াল করবেন তখন উভয়ই সময় অঞ্চলটির ধারণাটি পরিচালনা করার জন্য আপনাকে খুব সজাগ থাকতে হবে।

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

ডিসরিয়ালাইজিং (বা মধ্যরাতের ইউটিসি তারিখের অবজেক্ট তৈরি করা)

এটি দুটি গোলাকেন্দ্রিক পদক্ষেপ, সেই কৌশলটির সাথে দুটি "সঠিক" উত্তর রয়েছে। বেশিরভাগ সময়, আপনি আপনার তারিখটি ব্যবহারকারীর সময় অঞ্চলটি প্রতিফলিত করতে চান। আজ আপনার জন্মদিন হলে ক্লিক করুন । এনজেড এবং মার্কিন যুক্তরাষ্ট্রে ব্যবহারকারীরা একই সাথে ক্লিক করেন এবং বিভিন্ন তারিখ পান। সেক্ষেত্রে, এটি করুন ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

কখনও কখনও, আন্তর্জাতিক তুলনামূলক স্থানীয় নির্ভুলতা ট্রাম্প। সেক্ষেত্রে, এটি করুন ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

একটি তারিখের ডিসিজায়ালাইজ করুন

প্রায়শই তারের তারিখগুলি YYYY-MM-DD ফর্ম্যাটে থাকবে। এগুলি deserialize করতে, এটি করুন ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Serializing

আপনি তৈরি করার সময় টাইমজোন পরিচালনা করার যত্ন নিয়েছেন, আপনি যখন স্ট্রিং উপস্থাপনায় ফিরে যাবেন তখন আপনার অবশ্যই টাইমজোনটি বাইরে রাখার বিষয়ে নিশ্চিত হওয়া উচিত। সুতরাং আপনি নিরাপদে ব্যবহার করতে পারেন ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

এবং সম্পূর্ণরূপে অন্য সব কিছু এড়িয়ে চলুন, বিশেষত ...

  • getYear(), getMonth(),getDate()

সুতরাং আপনার প্রশ্নের উত্তর দিতে, 7 বছর খুব দেরী ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

এটি চলমান দেখুন ...

2019 আপডেট করুন ... ফ্রি স্টাফ ...

এই উত্তরের জনপ্রিয়তা দেওয়া, আমি এগুলি সব কোডে রেখেছি। নিম্নলিখিত ফাংশনটি একটি মোড়ানো তারিখের অবজেক্ট প্রদান করে এবং কেবলমাত্র একটি তারিখ with সহ নিরাপদে থাকা সেই ফাংশনগুলি উন্মোচিত করে ™

এটি একটি তারিখ অবজেক্টের সাথে কল করুন এবং এটি ব্যবহারকারীর সময় অঞ্চল প্রতিফলিত জাস্টাডেটে সমাধান করবে to স্ট্রিং সহ এটিকে কল করুন: যদি স্ট্রিংটি টাইমজোন নির্দিষ্ট করে একটি আইএসও 8601 হয় তবে আমরা সময়ের অংশটি সরিয়ে ফেলব। যদি সময় অঞ্চল নির্দিষ্ট না করা থাকে, আমরা তারিখের অবজেক্টের মতো, স্থানীয় সময় অঞ্চলকে প্রতিফলিত করে একটি তারিখে রূপান্তর করব।

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
আপনার উত্তরে সত্যই মূল্যবান তথ্য রয়েছে! দুর্ভাগ্যক্রমে আপনি আমাকে ওপির আসল প্রশ্নের উত্তরটি যুক্ত করেননি, আমাকে এটির উত্সাহ দেওয়া থেকে বিরত করেছিলেন। একটি ছোট কোড স্নিপেট যুক্ত করার চেষ্টা করুন যা ওপির প্রশ্নের উত্তর দেয়।
স্টিজন ডি উইট

হা হা হা @ '7 বছর দেরী'! আমি আপনার স্টাইল ব্যবহারকারী 1585345 পছন্দ! আপনি আমার ভোট পেয়েছেন!
স্টিজন ডি উইট

আমি এটি সহায়ক বলে মনে করেছি। নোট করুন "আন্তর্জাতিক তুলনামূলক" স্নিপেটে একটি টাইপ রয়েছে। আমি মনে করি এটি হওয়া উচিত: নতুন তারিখ (তারিখ.ইউটিসি (মাইডেট.সেটআউটসিফুলইয়ার (), মাইডেট.সেটআউটসিটিমোনথ (), মাইডেট.সেটআউটসিডিটি ()));
রিক্রাক

1
আমি আশা করি আমি এই উত্তরটি 100 বার upvote করতে পারি !!!
Sнаđошƒаӽ

77

এ কেমন?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

এটি আপনাকে আপনার ভেরিয়েবলের মানকে প্রভাবিত না করে এই তারিখের তারিখের অংশটি তুলনা করতে দেয়:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

এটি মূল পোস্টটির মধ্যে এখন পর্যন্ত সবচেয়ে মার্জিত উত্তর। আমি আমার উদ্দেশ্যে পৃথক ফাংশন তৈরি করিনি, কেবল দুটি লাইনের কোড অন্তর্ভুক্ত করেছি।
ড্যানিমাল রেকস

25

মোমেন্ট.জেএস ব্যবহার করে

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

উদাহরণস্বরূপ, এক তারিখের পরে যদি অন্য তারিখ আসে তবে তাদের সময়গুলি বাদ দিয়ে আপনি এই জাতীয় কিছু করবেন:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

দ্বিতীয় প্যারামিটারটি আপনি মধ্যে পাস isAfterতুলনা করতে স্পষ্টতা এবং কোন হতে পারে year, month, week, day, hour, minuteবা second


4
একটি মুহুর্তের সমাধান থেকে একটি তারিখ () + সেটফোর্স সমাধানে চলে আসা 100x স্পিডআপ পেয়েছে। সাবধান বন্ধুরা :-)
2c2c

@ 2c2c আকর্ষণীয়। পারফরম্যান্সের প্রভাবটি অবশ্যই জেনে ভাল। আপনি আপনার বেঞ্চমার্কের জন্য কয়টি অপারেশন ব্যবহার করেছেন?
জোশুয়া পিন্টার

1
আমি প্রায় 1 মিলিল তুলনা ছিল। Didnt সেটআপ প্রকৃত বেঞ্চমার্ক
2c2c

17

নীচের মত .toDateString ব্যবহার করে কেবল তুলনা করুন:

new Date().toDateString();

এটি আপনার তারিখের অংশটি কেবল সময় বা সময় অঞ্চল নয়, ফিরিয়ে দেবে:

"শুক্র ফেব্রুয়ারী 03 2017"

সুতরাং উভয় তারিখ একই সময়ের অংশ ছাড়া একইভাবে এই বিন্যাসে তুলনা করা যেতে পারে।


2
এটি একটি ভাল শুরু, তবে এটি তুলনার জন্য অনুমতি দেয় না কারণ এটি এখন একটি স্ট্রিং। তুলনা করতে, এটি করে কোনও তারিখ অবজেক্টে ফিরে আসুন new Date(new Date().toDateString());
গ্রিড ট্রেকোর

@ গ্রিডট্রেককোর সত্য, তবে আপনি যদি কেবলমাত্র দ্রুত সাম্যের পরীক্ষা চান তবে এটি সবচেয়ে সহজ সমাধান।
সিএম

8

এটি একটি সামান্য ক্লিনার সংস্করণ হতে পারে, এছাড়াও নোট করুন যে পার্সইন্ট ব্যবহার করার সময় আপনার সর্বদা একটি রেডিক্স ব্যবহার করা উচিত।

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

রেডিক্স সম্পর্কে আরও তথ্যের জন্য MDC পার্সইন্ট পৃষ্ঠাটি চেকআউট করুন ।

নিখোঁজ র‌্যাডিক্সের মতো জিনিসগুলি এবং অন্যান্য অনেকগুলি জিনিস যা অনর্থক এবং ডিবাগ ত্রুটিগুলি শক্ত করতে পারে এমন জিনিসগুলি ধরার জন্য জেএসলিন্ট একটি দুর্দান্ত সরঞ্জাম। এটি আপনাকে আরও ভাল কোডিং মান ব্যবহার করতে বাধ্য করে যাতে আপনি ভবিষ্যতের মাথাব্যথা এড়ান। আমি কোড করি প্রতিটি জাভাস্ক্রিপ্ট প্রকল্পে এটি ব্যবহার করি।


@ এমকেএ এখন কোনও ইস্যুটির মতো বড় হওয়া উচিত নয় কারণ বেশিরভাগ ব্রাউজারগুলিতে ইএস 5 মোটামুটি স্ট্যান্ডার্ড এবং এটি অষ্টাল ব্যাখ্যাটি নিষিদ্ধ করে তবে কিছু ব্রাউজার এখনও পিছনের সামঞ্জস্যতার কারণে পুরানো অষ্টাল ব্যাখ্যাটি ব্যবহার করতে পারে তাই আমি একটি রেডিক্স ব্যবহার চালিয়ে যাব অদূর ভবিষ্যতের জন্য।
অপ্রয়োজনীয় কোড

আপনি যদি কঠোর মোড অষ্টাল ব্যাখ্যার ব্যবহার করেন ত্রুটিগুলি ছুঁড়ে ফেলবে, এটি একটি ভাল জিনিস কারণ এটি আপনাকে ভুল ত্রুটিযুক্ত ত্রুটিগুলি খুঁজে পেতে সহায়তা করে।
অপ্রয়োজনীয় কোড

4

Date.js গ্রন্থাগার এই জিনিসের জন্য সুবিধাজনক। এটি সমস্ত জেএস তারিখ-সম্পর্কিত স্ক্রিপ্টিংকে অনেক সহজ করে তোলে।


11
এই লাইব্রেরিটি কীভাবে এটি আরও সহজ করে তোলে আপনি আরও তথ্য যুক্ত করতে পারেন?
মাহমুদ হানাফি

4

যদি আপনি সত্যিকার অর্থেই কেবল কোনও সময় উপাদান না রেখে তারিখের তুলনা করছেন, অন্য একটি সমাধান যা ভুল অনুভব করতে পারে তবে কাজ করে এবং সমস্ত Date()সময় এবং সময় অঞ্চল মাথাব্যথা এড়ায় তা হ'ল স্ট্রিং তুলনা ব্যবহার করে সরাসরি আইএসও স্ট্রিংয়ের তারিখের তুলনা করা:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

আপনি বর্তমান তারিখটি (ইউটিসি তারিখ, ব্যবহারকারীর স্থানীয় তারিখের চেয়ে বেশি নয়) পেতে পারেন:

> new Date().toISOString().split("T")[0]
"2019-04-22"

এর পক্ষে আমার যুক্তি প্রোগ্রামার সরলতা - আপনি ডেটটাইম এবং অফসেটগুলি সঠিকভাবে পরিচালনা করার চেষ্টা করার চেয়ে সম্ভবত গতির ব্যয়ে (আমি পারফরম্যান্সের সাথে তুলনা করিনি) এর চেয়ে এটাকে কম বলার সম্ভাবনা কম)


আপনি করতে পারেন new Date().toISOString().substr(0, 10) // "2019-04-22"
stomy

স্থানীয় তারিখের জন্য (নন-ইউটিসি তারিখ) আপনি ব্যবহার করতে পারেন new Date().toLocaleDateString() // "8/26/2019"। তবে পাঠ্যের তুলনা করা সঠিক হবে না ( "8/26/2019" >= "9/29/2001"যেমন মিথ্যা) is সুতরাং আপনাকে এটিকে new Date(new Date().toLocaleDateString())অন্য তারিখের সাথে নির্ভুলভাবে তুলনায় রূপান্তর করতে হবে ।
stomy

4

উভয় তারিখে কেবলমাত্র ডেটস্ট্রিং () ব্যবহার করুন। টোডেটস্ট্রিং সময়টি অন্তর্ভুক্ত করে না, সুতরাং একই তারিখে ২ বারের জন্য মানগুলি সমান হবে, নীচে প্রদর্শিত হিসাবে।

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

স্পষ্টতই এই প্রশ্নের উপর অন্যত্র প্রকাশিত কিছু সময় অঞ্চল উদ্বেগ বৈধ, তবে অনেক পরিস্থিতিতে, সেগুলি প্রাসঙ্গিক নয়।


1
আমার ক্ষেত্রে এই সমাধানটি নির্বাচিত উত্তর এবং বেশি ভোট দেওয়া উত্তরের চেয়ে অনেক ভাল। এটি "সময়ের তুলনা ছাড়াই" শিরোনামে স্পষ্টভাবে বলা হয়েছে, এই সমাধানটি ঠিক তেমনটি করে, তুলনা চালিয়ে যাওয়ার জন্য সময় নির্ধারণের প্রয়োজনীয়তা সংরক্ষণ করে। "কি ইভেন্ট এক্স এবং ইভেন্ট ওয়াই একই দিনে ঘটেছিল" এর উত্তর দেওয়ার জন্য উত্তর দেওয়ার চেয়ে ঠিক তারিখের তুলনা করা আরও বুদ্ধিমান হয়ে উঠেছে "ইস: 00: 00: 00.00 এএম X এর তারিখের সকাল 00:00 এর সাথে ঠিক একই রকম: 00:00 ইভেন্টের তারিখের ওয়াই? " অন্যান্য অনেক উত্তরদাতারা যা করছেন তা
মি। কে।

3

এইভাবেই আমি এটি করি:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}

আমি বর্তমানে এটি উত্পাদনে ব্যবহার করি এবং আমার কাছে কোনও সমস্যা বা ব্রাউজারের অসঙ্গতি ইত্যাদি নেই ... আপনি যে কারণে বলছেন যে getTime()এটি প্রয়োজনীয়?
ফ্যাব্রিজিও

5
দয়া করে সচেতন হন যে setHours()এটিতে যে বস্তুটি আহ্বান করা হয়েছে তা সংশোধন করে এবং একটি সংখ্যাকে কয়েক মিলি সেকেন্ড (কল করার সমতুল্য getTime()) হিসাবে ফিরিয়ে দেয় । সুতরাং আপনার todayভেরিয়েবল এমন কোনও Dateবস্তু নয় যা কিছু আশা করবে, তবে এটি মিলি সেকেন্ডের একটি সংখ্যার সংখ্যা। পার্শ্ব-প্রতিক্রিয়া হিসাবে এই কারণেই getTime()তুলনা করার আগে আপনাকে কল করার দরকার পড়েনি, কারণ আপনার ইতিমধ্যে একটি অস্পষ্ট পদ্ধতিতে।
টিমোথি ওয়াল্টার্স

3

যেহেতু আমি এখানে অনুরূপ পন্থা দেখতে পাচ্ছি না এবং আমি h / m / s / এমএস ০ এ সেট করা উপভোগ করছি না, কারণ এটি স্থানীয় সময় অঞ্চলে সঠিক পরিবর্তনের সাথে সমস্যা তৈরি করতে পারে date অবজেক্টের (আমার ধারণা তাই), আমাকে আসুন এখানে কিছু মুহুর্ত আগে লিখিত ফাংশন লিখিত:

+: ব্যবহার করা সহজ, একটি মৌলিক তুলনা অপারেশনগুলি সম্পন্ন করে (দিন ছাড়া মাস, বছরের তুলনা করে।)
-: মনে হয় এটি "বাক্সের বাইরে" চিন্তার সম্পূর্ণ বিপরীত।

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

ব্যবহার:

datecompare(date1, '===', date2)সমতা পরীক্ষা করার
datecompare(date1, '>', date2)জন্য, বৃহত্তর চেকের জন্য,
!datecompare(date1, '>', date2) জন্য, কম বা সমান পরীক্ষার জন্য

এছাড়াও, স্পষ্টতই, আপনি অন্য কোনও সাধারণ তুলনা অর্জনের জন্য স্যুইচ করতে date1এবং date2জায়গাগুলিতে যেতে পারেন ।


ভাল এক, প্লাস, আমাকে সাহায্য করেছে, এখন আশা করি আইসো রূপান্তরগুলি কামড়ান না, হাহাহা, ধন্যবাদ।
এডেনকর্বিন

3

তারিখগুলির তুলনা করার একটি দক্ষ ও সঠিক উপায় হ'ল:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

এটি সময়ের অংশটিকে উপেক্ষা করে, এটি বিভিন্ন সময় অঞ্চলগুলির জন্য কাজ করে এবং ==আপনিও সাম্যের জন্য তুলনা করতে পারেন । 86400000 হ'ল একদিনে মিলিসেকেন্ডের সংখ্যা (= 24*60*60*1000 ) ।

সতর্কতা ==অবলম্বন করুন যে সমতা অপারেটরটি কখনই তারিখের বিষয়গুলির তুলনা করার জন্য ব্যবহার করা উচিত নয় কারণ এটি ব্যর্থ হয় যখন আপনি সমতা পরীক্ষার জন্য কাজ করার আশা করেন কারণ এটি দুটি তারিখের অবজেক্টের সাথে তুলনা করে (এবং দুটি তারিখের তুলনা করে না) যেমন:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

দ্রষ্টব্য: আপনি যদি তারিখের অবজেক্টগুলির সাথে তুলনা করছেন যে সময়ের অংশটি শূন্যতে সেট করা আছে, তবে আপনি ব্যবহার করতে পারেন date1.getTime() == date2.getTime()তবে এটি অপ্টিমাইজেশনের পক্ষে কমই মূল্যবান। আপনি ডেট অবজেক্টের সাথে সরাসরি তুলনা করার সময় , ব্যবহার করতে পারেন <, বা এই অপারেটরগণ অপারেটর তুলনা করার আগে কল করে তারিখ অবজেক্টকে রূপান্তর করে ।><=>=.valueOf()


2

এই প্রশ্নটি পোস্ট হওয়ার পরে ঠিক একই সময়ে পড়ার পরে আমি আরও একটি সমাধান পোস্ট করার সিদ্ধান্ত নিয়েছি, যেহেতু এটি আমার পক্ষে কমপক্ষে প্রয়োজনীয়তার তুলনায় যথেষ্ট সন্তোষজনক নয়:

আমি এরকম কিছু ব্যবহার করেছি:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

সেই পদ্ধতিতে আমি তারিখগুলি পরে প্রক্রিয়াকরণের জন্য ফর্ম্যাটটিতে ব্যবহার করতে পারি used তবে এটি কেবল আমার প্রয়োজনের জন্যই ছিল, তবে আমি যাইহোক এটি পোস্ট করার সিদ্ধান্ত নিয়েছি, সম্ভবত এটি কারওর পক্ষে সহায়তা করবে


1
দয়া করে মনে রাখবেন আপনার currentDateপরিবর্তনশীল কোনও তারিখ নয়, এটি 1970-01-01 সাল থেকে অনেকগুলি মিলিসেকেন্ড। setHours()পদ্ধতি মডিফাই তারিখ বস্তুর উপর বলা হয়, এবং আয় সমপরিমাণ getTime()(1970-01-01 যেহেতু মিলিসেকেন্ডে তারিখ মান)।
টিমোথি ওয়াল্টার্স

1

নিশ্চিত করুন যে আপনি userDate4 অঙ্কের বছর হিসাবে এটি নির্মাণ করেছেন setFullYear(10, ...) !== setFullYear(2010, ...)


1

আপনি মোট এমএস সহ কিছু গাণিতিক ব্যবহার করতে পারেন।

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

আমি এটি পছন্দ করি কারণ মূল তারিখগুলিতে কোনও আপডেট করা হয় না এবং স্ট্রিং বিভক্ত হয়ে তুলনা করার চেয়ে দ্রুত সুগন্ধি হয়।

এই সাহায্য আশা করি!


1

এই জেএস নির্ধারিত তারিখের পরে সামগ্রীটি এখানে একই জিনিস তবে ডাব্লু 3 স্কুলগুলিতে পরিবর্তন করবে change

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

এটি আমার পক্ষে কাজ করে:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

গৃহীত উত্তরে, টাইমজোন ইস্যু রয়েছে এবং অন্য সময় 00:00:00 নয়


0

আমি জানি এই প্রশ্নের উত্তর ইতিমধ্যে দেওয়া হয়েছে এবং এটি সর্বোত্তম উপায় নাও হতে পারে, তবে আমার দৃশ্যে এটি পুরোপুরি কাজ করছে, তাই আমি ভেবেছিলাম এটি আমার মতো কাউকে সাহায্য করতে পারে।

যদি তোমার date stringমতো হয়

String dateString="2018-01-01T18:19:12.543";

এবং আপনি কেবল জেএসের অন্য তারিখ অবজেক্টের সাথে তারিখের অংশটি তুলনা করতে চান,

var anotherDate=new Date(); //some date

তারপর আপনি করতে হবে করতেconvertstringDate ব্যবহার করে বস্তুরnew Date("2018-01-01T18:19:12.543");

এবং কৌশলটি এখানে:

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

আমি ব্যবহার করেছি toDateString()এরDate object জাতীয়, যা তারিখের স্ট্রিংকে ফেরৎ শুধুমাত্র।

দ্রষ্টব্য: ব্যবহার করতে ভুলবেন না .valueOf() তারিখগুলির তুলনা করার সময় ফাংশনটি ।

আরও তথ্য .valeOf()এখানে রেফারেন্স হয়

শুভ কোডিং।



0

সাথে তুলনা setHours()করা সমাধান হবে। নমুনা:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

যদি আপনার তারিখের ফর্মেটটি আলাদা হয় তবে moment.js ব্যবহার করুন রূপান্তর গ্রন্থাগারটি ব্যবহার করুন এবং তারপরে দুটি তারিখের তুলনায় উপরের কোডটি ব্যবহার করুন

উদাহরণ:

যদি আপনার তারিখটি "ডিডি / এমএম / ওয়াইওয়াইওয়াই" তে থাকে এবং এটিকে "এমএম / ডিডি / ওয়াইওয়াইওয়াই" তে রূপান্তর করতে চায় তবে নীচের কোডের উদাহরণটি দেখুন

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0

আপনি fp_incr (0) ব্যবহার করতে পারেন। যা টাইমজোন অংশটি মধ্যরাতে সেট করে এবং একটি তারিখ অবজেক্ট দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.