ฉันจะได้รับความแตกต่างระหว่างสองวันใน JavaScript ได้อย่างไร


111

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

คำตอบ:


73

ใน JavaScript วันที่สามารถเปลี่ยนเป็นจำนวนมิลลิวินาทีตั้งแต่ epoc ได้โดยเรียกใช้getTime()method หรือใช้วันที่ในนิพจน์ตัวเลข

เพื่อให้ได้ความแตกต่างเพียงลบวันที่ทั้งสอง

ในการสร้างวันที่ใหม่ตามความแตกต่างเพียงแค่ส่งจำนวนมิลลิวินาทีในตัวสร้าง

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

แค่นี้ก็น่าจะใช้ได้แล้ว

แก้ไข : แก้ไขข้อผิดพลาดโดย @bdukes

แก้ไข :

สำหรับคำอธิบายของพฤติกรรมการoldBegin, oldEndและnewBeginมีDateอินสแตนซ์ เรียกตัวดำเนินการ+และ-จะทริกเกอร์การแคสต์อัตโนมัติ Javascript และจะเรียกvalueOf()เมธอดต้นแบบของวัตถุเหล่านั้นโดยอัตโนมัติ มันเกิดขึ้นว่าvalueOf()วิธีการที่จะดำเนินการในวัตถุที่เป็นสายไปDategetTime()

โดยพื้นฐานแล้ว: date.getTime() === date.valueOf() === (0 + date) === (+date)


รูปแบบที่ต้องการสำหรับ. getTime () ในการทำงานคืออะไร ... ตัวอย่างเช่น - วันที่ใหม่ ('22-12-2012 00:00 ') getTime () จะไม่ทำงาน ... มีความคิดอย่างไร
Jimmyt1988

1
สำหรับวันที่แยกวิเคราะห์ใน JS ฉันขอแนะนำให้คุณดูคำถามนี้: stackoverflow.com/questions/1576753/…
Vincent Robert

8
OldBegin, oldEnd และ NewBegin ควรเป็นDateวัตถุหรือไม่ ยากที่จะบอกว่าควรจะเป็นวัตถุประเภทใดเนื่องจากการประกาศตัวแปรจะถูกละไว้ที่นี่
Anderson Green

นอกจากนี้ยังมีฟังก์ชันที่คุณสามารถใช้เพื่อเพิ่มหรือลบวันที่ใน JavaScript: stackoverflow.com/a/1214753/975097
Anderson Green

ระมัดระวังการบวกเลขและวัน ดูคำตอบของฉันด้านล่างสำหรับคำอธิบาย
แดน

24

JavaScript รองรับความแตกต่างของวันที่ได้อย่างสมบูรณ์แบบนอกกรอบ

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

ตอนนี้ข้อผิดพลาดบางอย่าง ลองสิ่งนี้:

console.log(a - 10);
console.log(a + 10);

ดังนั้นหากคุณมีความเสี่ยงในการเพิ่มตัวเลขและวันที่ให้แปลงวันที่เป็นnumberโดยตรง

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

ตัวอย่างกำปั้นของฉันแสดงให้เห็นถึงพลังของวัตถุ Date แต่ดูเหมือนว่าจะเป็นระเบิดเวลา


Dan ฉันพบว่าตัวอย่างของคุณเข้าใจและปฏิบัติตามได้ง่ายที่สุด ขอบคุณ.
Melanie

5
"ข้อผิดพลาด" เป็นค่าเริ่มต้นตามข้อกำหนดของภาษา ตัวดำเนินการลบ-บังคับให้อาร์กิวเมนต์เป็นตัวเลขดังนั้นวันที่จะส่งกลับค่าเวลา ตัว+ดำเนินการมีงานมากเกินไปจึงอาจเพิ่มการบีบบังคับให้มีจำนวนหรือการเรียงต่อกัน เนื่องจากวันที่บังคับให้เป็นสตริงในกรณีนี้+จึงทำการต่อกัน ความสับสนไม่ใช่ความผิดของอ็อบเจ็กต์ Date แต่เป็นตัวดำเนินการที่โอเวอร์โหลด
RobG

9

ดู JsFiddle DEMO

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

สำหรับโค้ด HTML ของคุณ:

<div id="showTime"></div>

4

หากคุณไม่สนใจส่วนประกอบของเวลาคุณสามารถใช้.getDate()และ.setDate()ตั้งค่าส่วนวันที่ได้

ดังนั้นหากต้องการตั้งวันที่สิ้นสุดของคุณเป็น 2 สัปดาห์หลังจากวันที่เริ่มต้นของคุณให้ทำดังนี้:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

ในการคืนค่าความแตกต่าง (เป็นวัน) ระหว่างวันที่สองวันให้ทำดังนี้:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

สุดท้ายเรามาแก้ไขฟังก์ชันแรกเพื่อให้สามารถใช้ค่าที่ส่งกลับโดย 2nd เป็นพารามิเตอร์:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()จะทำลายอุปสรรครายเดือน ตัวอย่างเช่น 2011/04/26 และ 2011/05/01 จะคืนค่า -25 แต่ค่าชดเชยควรเป็น 5 วัน
nfm

var ds = วันที่ใหม่ (2014, 0, 31, 0, 0, 0, 0); var de = วันที่ใหม่ (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) return 0
Noor

3

ขอบคุณ @ Vincent Robertฉันลงเอยด้วยการใช้ตัวอย่างพื้นฐานของคุณแม้ว่าจะเป็นเรื่องจริงnewBegin + oldEnd - oldBeginก็ตาม นี่คือวิธีแก้ปัญหาขั้นสุดท้ายที่เรียบง่าย:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }

1
เป็นจุดที่ดีที่จะอธิบายว่าทำไมบางครั้งคุณถึงใช้getTimeและบางครั้งก็ไม่ใช้
แดน

2

ขึ้นอยู่กับความต้องการของคุณฟังก์ชันนี้จะคำนวณความแตกต่างระหว่าง 2 วันและส่งคืนผลลัพธ์เป็นทศนิยมวัน

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}

1
วางไว้ในการMath.abs()โทรและคุณจะได้รับทศนิยมที่เป็นบวกเสมอ
โคเอ็น.

1
คำแนะนำที่ดี Koen สิ่งนี้ทำให้ผู้คนมีทางเลือก 2 ทางคือวันที่ที่แท้จริงแตกต่างตามที่คุณแนะนำหรือวันที่ที่มีเครื่องหมายระบุว่าความแตกต่างนั้นเป็นอดีตหรืออนาคต :)
sparkyspider

โปรดทราบว่าใน JavaScript คุณสามารถเพิ่ม / ลบตัวเลขเป็นมิลลิวินาทีdate.getTime()เพื่อรับเวลาในอนาคต / ในอดีตได้ `var nextMinute = วันที่ใหม่ (someDate.getTime () + 60 * 1000);
แดน

นี่คือการพิมพ์ผิด? "ระหว่าง 2 วัน". อาจอยู่ระหว่าง 2 วันที่
tomazahlin

2

หากใช้ moment.js มีวิธีแก้ปัญหาที่ง่ายกว่าซึ่งจะทำให้คุณมีความแตกต่างของวันในโค้ดบรรทัดเดียว

moment(endDate).diff(moment(beginDate), 'days');

สามารถดูรายละเอียดเพิ่มเติมได้ในหน้า moment.js

ไชโยมิเกล


1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}

0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}

0

ทางเลือกการปรับเปลี่ยนรหัสขยาย ..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}

โปรดเพิ่มคำชี้แจงเพิ่มเติมในคำตอบของคุณและใช้ภาษาอังกฤษให้ดีขึ้น
คดีของ Fund Monica

วิธีแก้ปัญหานี้ผิดเพราะคุณใช้ 365 วันละเลยปีอธิกสุรทิน
Sergey Goliney

0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

0

รหัสนี้จะเติมระยะเวลาของปีการศึกษาเมื่อคุณป้อนวันที่เริ่มต้นและวันที่สิ้นสุด (วันที่ที่ได้รับการรับรอง) ของการศึกษาและตรวจสอบว่าระยะเวลาน้อยกว่าหนึ่งปีหรือไม่หากใช่ข้อความแจ้งเตือนจะคำนึงถึงองค์ประกอบอินพุตสามองค์ประกอบแรกtxtFromQualifDateและ ที่สองtxtQualifDateและสามtxtStudyYears

จะแสดงผลลัพธ์ของจำนวนปีพร้อมเศษส่วน

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }

1
ไม่เคยแยกวิเคราะห์สตริงวันที่เพื่อค้นหาปีเนื่องจากรูปลักษณ์ของสตริง (ตัวคั่นโดยเฉพาะ) แตกต่างกันในเบราว์เซอร์ ใช้getFullYearที่ออกแบบมาเพื่อสิ่งนั้น ------- ดูไลบรารี datejs บน googlecode ซึ่งอาจรองรับกรณีมุมส่วนใหญ่
Dan

ขอบคุณสำหรับคำแนะนำ @Dan แต่มันใช้งานได้และทดสอบสำหรับฉันในโครงการการปกครองจริง (เบราว์เซอร์ที่แตกต่างกัน) การเขียนโปรแกรมที่อ่อนแอหรือไม่? :)
shareef

0

หากคุณใช้อ็อบเจกต์ Date จากนั้นใช้getTime()ฟังก์ชันสำหรับวันที่ทั้งสองจะให้เวลาตามลำดับตั้งแต่วันที่ 1 มกราคม 1970 ในค่าตัวเลข จากนั้นคุณจะได้รับความแตกต่างระหว่างตัวเลขเหล่านี้

หากวิธีนี้ไม่สามารถช่วยคุณได้โปรดดูเอกสารทั้งหมด: http://www.w3schools.com/jsref/jsref_obj_date.asp


โอ้ใช่ไม่ได้สังเกตคำตอบด้านล่างนี้มีอายุไม่เกินครึ่งปี
โคเอ็น.

0

รหัสด้านล่างนี้จะส่งคืนวันที่เหลือจากวันนี้เป็นวันที่ล่วงหน้า

การพึ่งพา: jQuery และ MomentJs

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

0

นี่คือสิ่งที่ฉันทำในระบบของฉัน

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.