पल जेएस तारीख की तुलना


384

मैं अपनी तिथि के समय को प्रारूपित करने के लिए क्षण का उपयोग कर रहा हूं, यहां मेरे पास दो तिथि मान हैं, और मैं एक विशेष फ़ंक्शन को प्राप्त करना चाहता हूं जब एक तिथि दूसरे से अधिक होती है। मैंने उनके अधिकांश डॉक्स पढ़े, लेकिन इसे प्राप्त करने के लिए फ़ंक्शन नहीं मिला। मुझे पता है कि यह वहां होगा।

यह मेरा कोड है:

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()

    या शायद आपको इसकी बिल्कुल भी जरूरत नहीं है। सिर्फ इसलिए कि इनपुट मूल्य UTC में है, इसका मतलब यह नहीं है कि आपको अपने पूरे फ़ंक्शन में 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? यदि ऐसा है तो क्या?
मैट जॉनसन-पिंट

आपके संपादित कोड के लिए बहुत बहुत धन्यवाद, मैं लगभग वहां पहुंच गया हूं .. मेरे मामले में मेरे पास उपयोगकर्ता की ओर से समय क्षेत्र संख्या है जैसे दिनांक_time = 2014-03-25T23: 10 + 5: 30, जब मैं क्षण का उपयोग करता हूं (date_time) .utc () कुछ समय बाद मुझे अमान्य दिनांक मिल गया
दिबिश

1
जब मैंने +05: 30 डाला तो यह बहुत अच्छा है। एक बार फिर से अपनी दयालुता के लिए बहुत-बहुत धन्यवाद
Dibish

.isSame () वास्तव में वही है जिसकी मुझे तलाश थी। किसी तरह इससे पहले डॉक्स में याद किया।
विल स्ट्रोहल

231

आपको सीधे उनकी तुलना करने में सक्षम होना चाहिए।

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

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


87
मुझे ऐसा लगता है कि यह समझाने लायक है कि यह काम करता है क्योंकि जावास्क्रिप्ट उन वस्तुओं को प्राइमरी से जोड़ता है Object.prototype.valueOfजिनके माध्यम से एक नंबर के रूप में एक टाइमस्टैम्प को वापस करने के लिए पल प्रोटोटाइप में ओवरराइड किया जाता है। तो यह इसी के समान है now.format('x') > date.format('x')
tandrewnichols

नहीं, यह काम नहीं कर रहा है ... यहाँ मैंने कोशिश की है। // newDate अधिक है, तो अब की तारीख ... इसलिए यह प्रिंट अधिक से अधिक दोनों और lessthen स्थितियों में विफल रहता है const resDate = res.url.expiryDate; const newDate = moment (resDate); var अब = क्षण ()। प्रारूप ("डीडी / एमएम / YYYY"); अगर (अब <newDate) {कंसोल.लॉग ("सफलता"); } Else {console.log ( "असफल")}
स्टीव

3
@steve moment().format("DD/MM/YYYY")एक स्ट्रिंग लौटाएगा और फिर आप वर्णानुक्रम से तुलना कर रहे हैं और फिर 1 दिसंबर 2 जनवरी से पहले आएगा, क्योंकि आप दिनों के साथ भी अग्रणी हैं। format()यदि आप उस क्षण की तुलना सीधे करना चाहते हैं तो इसका उपयोग न करें ।
रयानविनचेस्टर २ '

28

Jsfiddle: 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 रिटर्न अगर dateTimeA dateTimeB से अधिक है

विधि 0 देता है, अगर dateTimeA dateTimeB के बराबर है

यह विधि -1 लौटती है अगर dateTimeA dateTimeB से कम है


1
function Compar1 (dateTimeA, dateTimeB) {रिटर्न मोमेंट (dateTimeA, 'MM / DD / YYY')। अंतर (dateTimeB, 'MM / DD / YYYY'); }
शमसेर

23

यह महत्वपूर्ण है कि आपके दिनांक सही में है आईएसओ प्रारूप जब के किसी भी उपयोग momentjs प्रश्नों : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

इसलिए 2014-03-24T01: 14: 000 के बजाय, आपका डेटाटाइम या तो होना चाहिए:

2014-03-24T01: 14: 00 या 2014-03-24T01: 14: 00.000Z

अन्यथा आपको निम्न पदावनति चेतावनी मिल सकती है और स्थिति झूठी का मूल्यांकन करेगी:

पदावनति चेतावनी: प्रदान किया गया मान किसी मान्यताप्राप्त RFC2822 या ISO प्रारूप में नहीं है। पल निर्माण js दिनांक () में वापस आता है, जो सभी ब्राउज़रों और संस्करणों में विश्वसनीय नहीं है। गैर RFC2822 / ISO दिनांक प्रारूप हतोत्साहित किए जाते हैं और आगामी प्रमुख रिलीज में हटा दिए जाएंगे। अधिक जानकारी के लिए कृपया 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यह दो स्ट्रिंग
प्रणॉय सरकार

@PranoySarkar क्या आप मुझे बता सकते हैं कि हमें और अधिक सावधान रहने की आवश्यकता क्यों है?
DEEPESH KUMAR R


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;
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.