মুহুর্তের জেএস তারিখের সময়ের তুলনা


384

আমি আমার তারিখের সময় ফর্ম্যাট করতে moment.js ব্যবহার করছি, এখানে আমার দুটি তারিখের মান রয়েছে এবং আমি যখন একটি তারিখের চেয়ে অন্য তারিখের চেয়ে বেশি হয় তখন আমি একটি নির্দিষ্ট ক্রিয়াকলাপ অর্জন করতে চাই। আমি তাদের বেশিরভাগ দস্তাবেজগুলি পড়েছি, তবে এটি অর্জনের জন্য ফাংশনটি খুঁজে পাইনি। আমি জানি এটা হবে।

এটি আমার কোড:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

সম্পাদন করা

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

এখানে আমি দুটি তারিখের সাথে তুলনা করছি অর্থাত্ 2014-03-24T01:15:000 > 2014-03-24T01:14:000প্রথমটি দ্বিতীয়টির চেয়ে বড়, তবে এটি সর্বদা অন্য অবস্থাতে যায়। কেন জানি না?

উত্তর:


540

আমি বিশ্বাস করি আপনি খুঁজছেন ক্যোয়ারী ফাংশন , isBefore, isSame, এবং isAfter

আপনি ঠিক কী চেষ্টা করছেন তা বলা কিছুটা মুশকিল। সম্ভবত আপনি কেবল ইনপুট সময় এবং বর্তমান সময়ের মধ্যে পার্থক্য পেতে চাইছেন? যদি তাই হয়, বিবেচনা পার্থক্য ফাংশন , diff। উদাহরণ স্বরূপ:

moment().diff(date_time, 'minutes')

কয়েকটি অন্যান্য জিনিস:

  • প্রথম লাইনে একটি ত্রুটি রয়েছে:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    যে কাজ করে না। আমি মনে করি আপনি বোঝাতে চেয়েছিলেন:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    অবশ্যই, আপনি পাশাপাশি:

    var date_time = '2013-03-24T10:15:20:12Z';
  • আপনি ব্যবহার করছেন: .tz('UTC')ভুলভাবে। .tzজন্যে মুহূর্ত-সময় অঞ্চল । আপনি যেমন অন্যান্য সময় অঞ্চলগুলির সাথে কাজ না করেন তবে আপনার এটি ব্যবহার করার দরকার নেই America/Los_Angeles

    আপনি যদি কোনও মানটিকে ইউটিসি হিসাবে বিশ্লেষণ করতে চান তবে ব্যবহার করুন:

    moment.utc(theStringToParse)

    অথবা, আপনি যদি কোনও স্থানীয় মানের বিশ্লেষণ করতে এবং এটি ইউটিসি তে রূপান্তর করতে চান তবে ব্যবহার করুন:

    moment(theStringToParse).utc()

    অথবা সম্ভবত আপনার এটি প্রয়োজন হয় না। ইনপুট মানটি ইউটিসি-তে রয়েছে বলেই এর অর্থ এই নয় যে আপনাকে আপনার পুরো ফাংশন জুড়ে ইউটিসিতে কাজ করতে হবে।

  • আপনি সম্ভবত "এখন" উদাহরণটি পেয়ে যাবেন বলে মনে হচ্ছে moment(new Date())। পরিবর্তে আপনি কেবল ব্যবহার করতে পারেন moment()

আপডেট করা হয়েছে

আপনার সম্পাদনার ভিত্তিতে, আমি মনে করি আপনি কেবল এটি করতে পারেন:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

অথবা, আপনি যদি নিশ্চিত করতে চান যে আপনার ক্ষেত্রগুলি সঠিক ফর্ম্যাটে হতে বৈধ হয়েছে:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
আপনার মূল্যবান মন্তব্যের জন্য ধন্যবাদ। আমি আপনার মন্তব্যগুলি অন্তর্ভুক্ত করার জন্য আমার কোডটি সম্পাদনা করেছি তবে পার্থক্যটি সঠিকভাবে পাচ্ছি না। আপনি কি দয়া করে আমার সম্পাদিত কোডটি পরীক্ষা করতে পারেন
ডিবিশ

3
আপডেট উত্তর দেখুন। সেকেন্ডের ক্ষেত্রে অঙ্কের সংখ্যাও দেখুন। এবং req.body.timezoneকখনও ছাড়া অন্য কিছু হয় Z? তা হলে কী?
ম্যাট জনসন-পিন্ট

আপনার সম্পাদিত কোডের জন্য আপনাকে অনেক ধন্যবাদ, আমি প্রায় পৌঁছে গেছি .. আমার ক্ষেত্রে আমি ব্যবহারকারীর পক্ষ থেকে সময় অঞ্চল নম্বর পেয়েছি যেমন তারিখ_টাইম = 2014-03-25T23: 10 + 5: 30, যখন আমি মুহূর্তটি ব্যবহার করি (তারিখের সময়) .utc () কিছু সময় আমি অবৈধ তারিখ পেয়েছি
ডিবিশ

1
আমি যখন +05: 30 রাখি তখন দুর্দান্ত কাজ করে। আবার আপনার
করুণার

.isSame () হ'ল আমি যা খুঁজছিলাম। এর আগে ডক্সে এটি কোনওভাবে মিস হয়েছে।
উইল স্ট্রোহল

231

আপনি তাদের সরাসরি তুলনা করতে সক্ষম হওয়া উচিত।

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


87
আমি মনে করি এটি এই হিসাবে কাজ করে যে এটি কাজ করে কারণ জাভাস্ক্রিপ্ট আদিমগুলিতে বস্তু coerces Object.prototype.valueOfযার মাধ্যমে মুহুর্তের প্রোটোটাইপটিতে একটি সংখ্যা হিসাবে একটি যুগের টাইমস্ট্যাম্প ফিরিয়ে আনতে পারে। সুতরাং এটি অনুরূপ now.format('x') > date.format('x')
tandrewnichols

না এটি কাজ করছে না ... এখানে আমি চেষ্টা করেছি। // নতুন তারিখ এখনকার তারিখের চেয়েও উচ্চতর ... সুতরাং এটি বৃহত্তর এবং নিম্নতর উভয় অবস্থাতেই ব্যর্থ ছাপ দেয় কনসেটের রেজিস্টেট = res.url.expiryDate; const newDate = moment (resDate); var now = moment ()। format ("DD / MM / YYYY"); যদি (এখন <নতুন তারিখ) so কনসোল.লগ ("সাফল্য"); } অন্য {কনসোল.লগ ("ব্যর্থ")}
স্টিভ

3
@ স্টিভ moment().format("DD/MM/YYYY")একটি স্ট্রিং ফিরে আসবে এবং তারপরে আপনি বর্ণানুক্রমিকভাবে তুলনা করছেন এবং তারপরে 1 লা ডিসেম্বর আসবে 2 শে জানুয়ারীর আগে, কারণ আপনিও দিনগুলি নিয়ে নেতৃত্ব দিচ্ছেন। আপনি format()যদি সরাসরি আপত্তিটির মুহুর্তটি তুলনা করতে চান তবে ব্যবহার করবেন না ।
রায়ানউইনচেস্টার

28

জেএসফিডাল: http://jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

ডেটটাইমআউট ডেটটাইমবির চেয়ে বেশি হলে পদ্ধতিটি 1 প্রদান করে

ডেটটাইমএর সাথে ডেটটাইমবি সমান হলে পদ্ধতিটি 0 প্রদান করে

তারিখটিমায় তারিখের চেয়ে কম হলে পদ্ধতিটি -1 প্রদান করে


1
ফাংশন তুলনা 1 (ডেটটাইম, ডেটটাইমবি) {রিটার্ন মুহুর্ত (ডেটটাইম, 'এমএম / ডিডি / ওয়াইওয়াইওয়াই) dif }
শমসির

23

এটি গুরুত্বপূর্ণ যে, আপনার DATETIME সঠিক মধ্যে হয় ISO ফর্ম্যাটে যখন কোন ব্যবহার momentjs প্রশ্নের : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

সুতরাং 2014-03-24T01: 14: 000 এর পরিবর্তে, আপনার তারিখের সময়টি হওয়া উচিত:

2014-03-24T01: 14: 00 বা 2014-03-24T01: 14: 00.000Z

অন্যথায় আপনি নিম্নলিখিত অবচয় হুঁশিয়ারি পেতে পারেন এবং শর্তটি মিথ্যা হিসাবে মূল্যায়ন করবে:

অবচয় হুঁশিয়ারি: প্রদত্ত মান কোনও স্বীকৃত আরএফসি 2822 বা আইএসও ফর্ম্যাটে নেই। মুহূর্তের নির্মাণটি জেএস ডেটে ফিরে আসে (), যা সমস্ত ব্রাউজার এবং সংস্করণে নির্ভরযোগ্য নয়। আরএফসি ২২২২২ / আইএসও তারিখের ফর্ম্যাটগুলি নিরুৎসাহিত করা হবে এবং আসন্ন একটি বড় রিলিজে সরানো হবে। আরও তথ্যের জন্য দয়া করে http://momentjs.com/guides/#/warnings/js-date/ দেখুন।

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

এই মুহুর্তে তারিখটি পাস করুন এটি তুলনা করে ফলাফল দেবে। আপনি যদি ফর্ম্যাট না চান তবে এটি মুছে ফেলুন

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulএটি দুটি স্ট্রিংয়ের তুলনা ছাড়া কিছুই নয়
প্রণয় সরকার

@ প্রনয়সরকার আপনি দয়া করে আমাকে বলতে পারেন কেন আমাদের আরও যত্নবান হওয়া দরকার?
দেপেশ কুমার আর


2

তারিখ-সময়ের তুলনার জন্য, আপনি valueOfসেই মুহুর্তের ফাংশনটি ব্যবহার করতে পারেন যা তারিখের সময়ের মিলি সেকেন্ড সরবরাহ করে, যা তুলনার জন্য সেরা:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.