ฉันจะรับจำนวนวันระหว่างสองวันใน JavaScript ได้อย่างไร


403

ฉันจะรับจำนวนวันระหว่างสองวันใน JavaScript ได้อย่างไร ตัวอย่างเช่นกำหนดสองวันในกล่องป้อนข้อมูล:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

5
99% ของกรณีที่ผู้ใช้ขอ "จำนวนวันระหว่างวันที่สองวัน" สิ่งที่เธอไม่เข้าใจคือเธอพยายามเปรียบเทียบแอปเปิ้ลกับลูกแพร์ ปัญหาจะกลายเป็นเรื่องง่ายถ้าถามว่า "มีกี่วันในช่วง DATE?" หรือว่าฉันต้องข้ามปฏิทินกี่สี่เหลี่ยม สิ่งนี้จะช่วยให้เราประหยัดเวลาและเวลาในช่วงกลางวัน ฯลฯ ความสับสนนั้นมีนัยยะต่อเราเพราะโครงสร้างข้อมูล datetime ซึ่งเป็นเรื่องไร้สาระ ไม่มีสิ่งเช่น datetime ที่มีวันที่และมีเวลาวัตถุสองอย่างที่แตกต่างกันมากทั้งในธรรมชาติและพฤติกรรม
Mihail Shishkov

สำหรับฟังก์ชั่นที่แยกความแตกต่างเป็นหน่วย (ทั้งหมด) เวลาที่ใช้คำตอบที่stackoverflow.com/a/53092438/3787376
Edward

ฉันรู้สึกว่าคำถามนี้ควรถูกลบหรืออย่างน้อยก็ทำเครื่องหมายว่า "หลีกเลี่ยง" เนื่องจากคำตอบส่วนใหญ่นั้นไม่ถูกต้องหรือขึ้นอยู่กับไลบรารีต่างๆ
RobG

คำตอบ:


409

นี่คือการดำเนินการที่รวดเร็วและสกปรกdatediffซึ่งเป็นข้อพิสูจน์แนวคิดในการแก้ปัญหาตามที่นำเสนอในคำถาม ขึ้นอยู่กับความจริงที่ว่าคุณจะได้รับมิลลิวินาทีที่ผ่านไประหว่างวันที่สองวันโดยการลบพวกเขาซึ่งรวมเข้ากับค่าตัวเลขดั้งเดิม (มิลลิวินาทีนับตั้งแต่จุดเริ่มต้นของปี 1970)

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

คุณควรทราบว่า API วันที่ "ปกติ" (ไม่มี "UTC" ในชื่อ) ทำงานในเขตเวลาท้องถิ่นของเบราว์เซอร์ของผู้ใช้ดังนั้นโดยทั่วไปคุณอาจพบปัญหาหากผู้ใช้ของคุณอยู่ในเขตเวลาที่คุณไม่ คาดหวังและรหัสของคุณจะต้องจัดการกับการเปลี่ยนเวลาออมแสง คุณควรอ่านเอกสารสำหรับวัตถุวันที่และวิธีการอย่างรอบคอบและสำหรับสิ่งที่ซับซ้อนกว่านี้ให้พิจารณาใช้ห้องสมุดที่มี API ที่ปลอดภัยและมีประสิทธิภาพมากขึ้นสำหรับการจัดการวันที่

นอกจากนี้เพื่อวัตถุประสงค์ในการแสดงตัวอย่างโค้ดใช้การเข้าถึงแบบกำหนดชื่อบนwindowวัตถุเพื่อความกะทัดรัด แต่ในการผลิตคุณควรใช้ API มาตรฐานเช่นgetElementByIdหรือเฟรมเวิร์ก UI บางส่วน


2
ฉันคิดว่า Math.trunc () เหมาะสมกว่า ในกรณีที่มีคนใช้วัตถุวันที่ที่แม่นยำยิ่งขึ้น (เช่นชั่วโมงนาทีและวินาที)
จินหวาง

21
เนื่องจากคำตอบที่ทำเครื่องหมายถูกต้องและได้รับคะแนนสูงสุด (ณ ตอนนี้) เป็นสิ่งที่ควรค่าแก่การแสดงความคิดเห็นว่าคำตอบนี้ไม่ถูกต้องตามเวลาออมแสง ดูคำตอบของ Michael Liu แทน
osullic

parseDate ทำอะไรกันแน่
Mohammad Kermani

2
@ osullic - คำตอบนี้จัดการการปรับเวลาตามฤดูกาลด้วยMath.roundอย่างไรก็ตามคาดว่าจะส่งสตริงวันที่เท่านั้นไม่ใช่วันที่และเวลา
RobG

2
เพียงจำไว้ว่าวันที่อยู่ในรูปแบบสหรัฐฯในตัวอย่างนี้คือ MM / DD / YYYY หากคุณต้องการเวอร์ชั่นสหราชอาณาจักรคุณต้องเปลี่ยนparseDateวิธีการเป็น:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

ขณะที่เขียนนี้คำตอบอื่นเพียงคำตอบเดียวที่ถูกต้องจะจัดการกับการเปลี่ยน DST (เวลาออมแสง) นี่คือผลลัพธ์ของระบบที่ตั้งอยู่ในรัฐแคลิฟอร์เนีย:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

แม้ว่าจะMath.roundส่งกลับผลลัพธ์ที่ถูกต้อง แต่ฉันคิดว่ามันค่อนข้างน่าเบื่อ แต่โดยการลงบัญชีอย่างชัดเจนสำหรับการเปลี่ยนแปลง UTC ตรงข้ามเมื่อ DST เริ่มต้นหรือสิ้นสุดเราสามารถใช้เลขคณิตที่แน่นอนได้:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

คำอธิบาย

การคำนวณวันที่ของ JavaScript นั้นยุ่งยากเพราะ Dateวัตถุเก็บเวลาภายในเป็น UTC ไม่ใช่เวลาท้องถิ่น ตัวอย่างเช่น 3/10/2013 12:00 AM เวลามาตรฐานแปซิฟิก (UTC-08: 00) ถูกเก็บเป็น 3/10/2013 8:00 AM UTC และ 3/11/2013 12:00 AM เวลาตามฤดูกาลของแปซิฟิก ( UTC-07: 00) ถูกเก็บเป็น 3/11/2013 7:00 AM UTC ในวันนี้เวลาท้องถิ่นเที่ยงคืนถึงเที่ยงคืนเป็นเวลา 23 ชั่วโมงใน UTC!

แม้ว่าหนึ่งวันในเวลาท้องถิ่นอาจมีเวลามากกว่าหรือน้อยกว่า 24 ชั่วโมง แต่วันหนึ่งใน UTC นั้นเป็นเวลา 24 ชั่วโมงเสมอ 1daysBetweenวิธีการดังกล่าวข้างต้นแสดงให้เห็นว่าใช้ประโยชน์จากความเป็นจริงนี้โดยการโทรครั้งแรกtreatAsUTCในการปรับครั้งทั้งในระดับท้องถิ่นถึงเที่ยงคืน UTC ก่อนที่จะลบและแบ่ง

1. JavaScript ไม่สนใจวินาทีกระโดด


2
ไม่จำเป็นต้องใช้ UTC ก็แค่เพียงตั้งเวลาท้องถิ่นเป็นเที่ยงคืน (หรือค่าเดียวกันสำหรับวันที่ทั้งสอง) วันเศษส่วนการแนะนำให้รู้จักออมแสงเป็นเพียง± 0.04 ที่มากที่สุด (และในบางสถานที่น้อยกว่า) จึงเดินออกมาพร้อมกับMath.Round ;-) การใช้ตัวสร้าง Date เพื่อแยกสตริงไม่ใช่ความคิดที่ดี หากคุณต้องการใช้ค่า UTC ให้แยกสตริงที่ใช้Date.UTC(...)ในตอนแรก
RobG

2
@RobG: ตามที่ระบุไว้ในคำตอบของฉัน: "ถึงแม้ว่า Math.round จะให้ผลลัพธ์ที่ถูกต้อง แต่ฉันคิดว่ามันค่อนข้างน่าเบื่อ แต่โดยการบัญชีสำหรับการเปลี่ยนแปลง UTC offset เมื่อ DST เริ่มต้นหรือสิ้นสุดเราสามารถใช้เลขคณิตที่แน่นอนได้"
Michael Liu

ที่จริงแล้วเวลาที่คุณแสดงว่า "ไม่ถูกต้อง" นั้นตามหลักวิชาการถูกต้อง คุณไม่ได้เปลี่ยน DateTimes เป็น UTC ... คุณเพียงแค่เปลี่ยนเวลาของแต่ละ DateTime เพื่อรับจำนวนเต็มทั้งหมด การปัดเศษไม่ใช่ "clunky" ... มันเป็นวิธีการที่ถูกต้องตรงนี้เพราะนั่นคือสิ่งที่คุณทำอยู่ในหัวของคุณอย่างไรก็ตามคุณกำลังปัดเศษส่วนเวลา (ชั่วโมงนาทีวินาที) และแค่พยายามทำให้ได้ทั้งหมด จำนวนวัน
JDB ยังคงจดจำโมนิก้าได้

116

วิธีที่ง่ายที่สุดในการรับความแตกต่างระหว่างวันที่สองวัน:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

คุณได้รับวันที่แตกต่างกัน (หรือ NaN หากไม่สามารถแยกวิเคราะห์หนึ่งหรือทั้งสอง) วันที่ในการแยกวิเคราะห์ให้ผลลัพธ์เป็นมิลลิวินาทีและเพื่อให้ได้รับในแต่ละวันคุณจะต้องหารด้วย 24 * 60 * 60 * 1000

หากคุณต้องการให้หารด้วยวันชั่วโมงนาทีวินาทีและมิลลิวินาที:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

นี่คือเวอร์ชั่น James ที่ได้รับการปรับปรุงใหม่ของฉัน:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}

2
คำตอบที่ไม่ดี Math.floor () จะสูญเสียคุณหนึ่งวันเมื่อเวลาผ่านไปเพื่อประหยัดเวลา Math.round () จะให้คำตอบที่ถูกต้องในสถานการณ์ส่วนใหญ่ แต่มีตัวเลือกที่ดีกว่าในคำตอบอื่น ๆ เช่นกัน
ฟิล B

101

ฉันขอแนะนำให้ใช้ห้องสมุด moment.js ( http://momentjs.com/docs/#/displaying/difference/ ) มันจัดการเวลาออมแสงอย่างถูกต้องและโดยทั่วไปดีในการทำงานกับ

ตัวอย่าง:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1

10
เช่นเดียวกับการเตือนในขณะที่โมเมนต์เจ๊จะดีมันค่อนข้างพึ่งพามาก
เจสัน Axelson

มันควรจะเป็นจริงend.diff(start,"days")แม้ว่ารหัสตามที่เขียนจะใช้ได้เพราะวันที่เริ่มต้นคือหลังจากวันที่สิ้นสุด!
gordon613

40

ฉันจะไปข้างหน้าและคว้ายูทิลิตี้ขนาดเล็กนี้และในนั้นคุณจะพบฟังก์ชั่นนี้สำหรับคุณ นี่เป็นตัวอย่างสั้น ๆ :

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>

28
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. กำหนดวันที่เริ่มต้น
  2. กำหนดวันที่สิ้นสุด
  3. คำนวณความแตกต่าง
  4. แปลงมิลลิวินาทีเป็นวัน

อัปเดต: ฉันรู้ว่านี่ไม่ใช่ส่วนหนึ่งของคำถามของคุณ แต่โดยทั่วไปฉันจะไม่แนะนำให้ทำการคำนวณวันที่หรือการจัดการใน vanilla JavaScript และใช้ไลบรารีเช่นdate-fnsหรือmoment.jsเนื่องจากมีกรณีขอบจำนวนมาก


5
ฉันขอขอบคุณคำตอบเช่นนี้สั้น ๆ ง่าย ๆ และไม่จำเป็นต้องพึ่งพาการสุ่ม! ไชโย
daCoda

2
ฉันแค่เป็นคนที่timeDiffกลับมาเป็นลบหรือเปล่า? ไม่ควรtimeDiffจะเป็น(new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi

@ feyisayo-sonubi ขึ้นอยู่กับว่าคุณจะเริ่มต้นและสิ้นสุดวันที่ลำดับใด ในตัวอย่างนี้(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann

const timeDiff = +(new Date(start)) - +(new Date(end));
Ben Racicot

ยิ่งใหญ่ แม้ว่าฉันจะชอบreturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

ใช้ Moment.js

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>


ขณะนี้มีประโยชน์จริงๆสำหรับสิ่งต่างๆเช่น YTD diff นับได้ var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); มากขึ้นที่นี่: momentjs.com
Sharif

11

ค่าวันที่ใน JS คือค่าวันที่และเวลา

ดังนั้นการคำนวณวันที่โดยตรงจึงไม่สอดคล้องกัน:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

เช่นเราจำเป็นต้องแปลงวันที่ 2:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

วิธีการสามารถตัดทอนลัอในวันที่ทั้งสอง:

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);


9

ดีกว่าที่จะกำจัด DST, Math.ceil, Math.floor ฯลฯ โดยใช้เวลา UTC:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

ตัวอย่างนี้ให้ผลต่าง 109 วัน 24*60*60*1000คือหนึ่งวันในหน่วยมิลลิวินาที


9

ในการคำนวณวันระหว่าง 2 วันที่กำหนดคุณสามารถใช้รหัสต่อไปนี้วันที่ฉันใช้ที่นี่คือ Jan 01 2016 และ 31 ธันวาคม 2016

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>


9

มีความเป็นไปได้ที่จะคำนวณความแตกต่างของจำนวนวันที่พิสูจน์ได้ระหว่างวันที่สองวันที่อยู่ใน TZ ที่ต่างกันโดยใช้สูตรต่อไปนี้:

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);


นี่เป็นคำตอบที่ถูกต้องที่สุดคุณต้องพิจารณา DST ด้วย! ขอบคุณ
Gisway

6

ฉันพบคำถามนี้เมื่อฉันต้องการคำนวณในวันที่สองวัน แต่วันที่มีค่าชั่วโมงและนาทีฉันแก้ไขคำตอบของ @ michael-liu เพื่อให้พอดีกับความต้องการของฉันและผ่านการทดสอบของฉัน

diff วัน2012-12-31 23:00และ2013-01-01 01:00ควรเท่ากับ 1 (2 ชั่วโมง) diff วัน2012-12-31 01:00และ2013-01-01 23:00ควรเท่ากับ 1 (46 ชั่วโมง)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}


6

ผมคิดว่าการแก้ปัญหาที่ไม่ถูกต้อง 100% ผมจะใช้ceilแทนชั้น , การทำงานจะรอบ แต่ก็ไม่ได้การดำเนินการที่เหมาะสม

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}

4
วันสามารถมีได้มากกว่า 24 ชั่วโมงและนาทีสามารถมีมากกว่า 60 วินาที ใช้ Math.ceil () จะ overcount ในกรณีเหล่านี้
Rich Dougherty

5

สิ่งที่เกี่ยวกับการใช้รูปแบบวันที่จากวิดเจ็ต DatePicker? คุณสามารถใช้มันเพื่อแปลงวันที่ในรูปแบบเวลาประทับ (มิลลิวินาทีตั้งแต่ 01/01/1970) จากนั้นทำการลบอย่างง่าย


5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));


1
ฉันขอให้คุณเพิ่มบริบทเพิ่มเติมในคำตอบของคุณได้ไหม คำตอบแบบรหัสเท่านั้นยากที่จะเข้าใจ มันจะช่วยผู้ถามและผู้อ่านในอนาคตทั้งสองหากคุณสามารถเพิ่มข้อมูลเพิ่มเติมในโพสต์ของคุณ
RBT

ฉันต้องการแก้ไข แต่ฉันได้รับข้อผิดพลาดฉันสามารถส่งการแก้ไข :(
Noreddine Belhadj Cheikh

2
@ N.Belhadj คุณสามารถแทนที่วงทั้งหมดเหล่านั้นด้วยการดำเนินการ div และ mod (%) ที่เรียบง่าย
Mihail Shishkov

4

นี่อาจไม่ใช่ทางออกที่หรูหราที่สุด แต่ดูเหมือนว่าจะตอบคำถามด้วยรหัสที่ค่อนข้างง่าย คุณไม่สามารถใช้สิ่งนี้:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

นี่คือการสมมติว่าคุณผ่านวัตถุวันที่เป็นพารามิเตอร์


4

หากคุณมีการประทับเวลาสองยูนิกซ์คุณสามารถใช้ฟังก์ชั่นนี้ (ทำ verbose เพิ่มเติมเพื่อความชัดเจน):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

ตัวอย่าง:

daysBetween(1096580303, 1308713220); // 2455

4

ระวังเมื่อใช้มิลลิวินาทีใช้มิลลิวินาที

date.getTime ()ผลตอบแทนมิลลิวินาทีและทำในการดำเนินการทางคณิตศาสตร์กับมิลลิวินาทีจะต้องรวมถึง

  • เวลาออมแสง (DST)
  • ตรวจสอบว่าวันที่ทั้งสองมีเวลาเหมือนกันหรือไม่ (ชั่วโมง, นาที, วินาที, มิลลิวินาที)
  • ตรวจสอบให้แน่ใจว่าพฤติกรรมของวันแตกต่างกัน: 19 กันยายน 2559 - 29 กันยายน 2559 = 1 หรือ 2 วันแตกต่างกันอย่างไร

ตัวอย่างจากความคิดเห็นดังกล่าวข้างต้นเป็นทางออกที่ดีที่สุดที่ฉันพบเพื่อให้ห่างไกล https://stackoverflow.com/a/11252167/2091095 แต่ใช้+1กับผลลัพธ์หากคุณต้องการให้นับทุกวันที่เกี่ยวข้อง

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;


3

ฉันมีปัญหาเดียวกันในเชิงมุม ฉันทำสำเนาเพราะมิฉะนั้นเขาจะเขียนทับวันที่แรก ทั้งสองวันต้องมีเวลา 00:00:00 (ชัด)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

3

ฉันใช้โค้ดด้านล่างเพื่อทดสอบการทำงานของวันที่โพสต์สำหรับข่าวโพสต์ฉันคำนวณนาทีหรือชั่วโมงหรือวันหรือปีตามวันที่โพสต์และวันที่ปัจจุบัน

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

โปรดอธิบายรหัสของคุณและคุณแก้ไขปัญหาได้เพียงแค่การวางโค้ดนั้นถือเป็นคำตอบที่ไม่ดี
Marco Scabbiolo

2
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Michael Parker

ขอบคุณ @ MarcoScabbiolo, @ Michael Parker สำหรับความคิดเห็นตั้งแต่ฉันยังใหม่กับ Stackoverflow ในแง่ของการตอบรับฉันไม่ทราบว่าโซลูชันควรได้รับการจัดสรรอย่างไร
Ramees Rahath

3

หากคุณต้องการ DateArray ที่มีวันที่ลอง:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet


3

วิธีง่ายๆในการคำนวณวันระหว่างวันที่สองวันคือการลบองค์ประกอบเวลาทั้งสองเช่นการตั้งค่าชั่วโมงนาทีวินาทีและมิลลิวินาทีเป็น 0 จากนั้นจึงลบเวลาของพวกเขาและดำน้ำด้วยมิลลิวินาทีมูลค่าหนึ่งวัน

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

ปัญหาเกี่ยวกับวิธีแก้ไขของคุณคือคุณสมมติว่าวันที่หนึ่งและวันที่สองเป็นวันที่ซึ่งไม่จำเป็นต้องเปลี่ยนเป็นวันที่อีกครั้งและหากไม่ใช่วันที่ * ซึ่งไม่ใช่) คุณจะได้รับข้อผิดพลาดใน setHours เพื่อแก้ไขสิ่งนี้คุณต้องย้าย setHours ออกจากnew Date
AaA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

เรียบง่ายง่ายและซับซ้อน ฟังก์ชั่นนี้จะถูกเรียกใช้ทุก ๆ 1 วินาทีเพื่ออัปเดตเวลา

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

ทางออกที่ดีกว่าโดย

ไม่สนใจเวลาส่วนหนึ่ง

มันจะคืนค่า 0 ถ้าทั้งคู่เป็นวันเดียวกัน

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

มีส่วนร่วมสำหรับวันที่ก่อน 1970-01-01 และหลัง 2038-01-19

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

คุณสามารถใช้ UnderscoreJS สำหรับการจัดรูปแบบและคำนวณความแตกต่าง

สาธิต https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.