2012-06-07 53 views
63

Tôi muốn cho phép người dùng dễ dàng cộng và trừ ngày bằng JavaScript để duyệt các mục nhập của họ theo ngày.Làm thế nào để cộng/trừ ngày tháng với JavaScript?

Ngày có định dạng: "mm/dd/yyyy". Tôi muốn họ có thể nhấp vào nút "Tiếp theo" và nếu ngày đó là: "06/01/2012" thì khi nhấp vào tiếp theo, nó sẽ trở thành: "06/02/2012". Nếu họ nhấp vào nút 'prev' thì nó sẽ trở thành, "05/31/2012".

Cần theo dõi năm nhuận, số ngày trong tháng, v.v.

Mọi ý tưởng?

P.S sử dụng AJAX để lấy ngày từ máy chủ không phải là một tùy chọn, hơi lag và không phải là trải nghiệm cho người dùng mà khách hàng muốn.

+1

nếu bạn đang sử dụng datepicker. sau đó 'dateValue = $ .datepicker.parseDate (" mm/dd/yy ", '06/01/2012 ');' 'dateValue.setDate (dateValue.getDate() + 1);' –

Trả lời

83

Code:

var date = new Date('2011','01','02'); 
alert('the original date is '+date); 
var newdate = new Date(date); 

newdate.setDate(newdate.getDate() - 7); // minus the date 

var nd = new Date(newdate); 
alert('the new date is '+nd);​ 

JSFiddle Demo

Sử dụng datepicker:

$("#in").datepicker({ 
    minDate: 0, 
    onSelect: function(dateText, inst) { 
     var actualDate = new Date(dateText); 
     var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate()+1); 
     $('#out').datepicker('option', 'minDate', newDate); 
    } 
}); 

$("#out").datepicker();​ 

JSFiddle Demo

thứ phụ mà có thể đến tiện dụng:

getDate() Returns the day of the month (from 1-31) 
getDay() Returns the day of the week (from 0-6) 
getFullYear() Returns the year (four digits) 
getHours() Returns the hour (from 0-23) 
getMilliseconds() Returns the milliseconds (from 0-999) 
getMinutes() Returns the minutes (from 0-59) 
getMonth() Returns the month (from 0-11) 
getSeconds() Returns the seconds (from 0-59) 

Tốt link:MDN Date

+0

Tại sao tạo ngày mới thứ 3 : var nd = new Date (newdate) ?? Đối tượng ngày tháng, newdate, như được điều chỉnh bởi .setDate là tốt, phải không? –

+0

@KevinM yep, phụ thuộc vào mục đích để 'nd' là ngày mới' var' vừa được tạo cho rõ ràng! ':)' –

1

Bạn có thể sử dụng đối tượng Ngày javascript gốc để theo dõi ngày tháng. Nó sẽ cung cấp cho bạn ngày hiện tại, cho phép bạn theo dõi lịch cụ thể và thậm chí giúp bạn quản lý các múi giờ khác nhau. Bạn có thể thêm và trừ ngày/giờ/giây để thay đổi ngày bạn đang làm việc hoặc để tính ngày mới.

hãy xem tài liệu tham khảo đối tượng này để tìm hiểu thêm:

Date

Hy vọng rằng sẽ giúp!

14
startdate.setDate(startdate.getDate() - daysToSubtract); 


startdate.setDate(startdate.getDate() + daysToAdd); 
4

Có thể điều này có thể giúp

<script type="text/javascript" language="javascript"> 
     function AddDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() + parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 

function SubtractDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() - parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 
    </script> 
    ---------------------- UI --------------- 
     <div id="result"> 
     </div> 
     <input type="text" value="0" onkeyup="AddDays(this.value);" /> 
     <input type="text" value="0" onkeyup="SubtractDays(this.value);" /> 
6

Đối tượng JavaScript Date có thể giúp đây.

Bước đầu tiên là chuyển đổi các chuỗi đó thành Date trường hợp. Điều đó dễ thực hiện:

var str = "06/07/2012"; // E.g., "mm/dd/yyyy"; 
var dt = new Date(parseInt(str.substring(6), 10),  // Year 
        parseInt(str.substring(0, 2), 10) - 1, // Month (0-11) 
        parseInt(str.substring(3, 5), 10)); // Day 

Sau đó, bạn có thể thực hiện tất cả các tính toán hữu ích. Ngày JavaScript hiểu năm nhuận và như vậy. Chúng sử dụng khái niệm "ngày" lý tưởng là chính xác là dài 86,400 giây. Giá trị cơ bản của chúng là số mili giây kể từ thời Đại Kỷ Nguyên (nửa đêm, ngày 1 tháng 1 năm 1970); nó có thể là một số âm cho những ngày trước Đại Kỷ Nguyên.

Thông tin thêm về số MDN page on Date.

Bạn cũng có thể xem xét sử dụng một thư viện như MomentJS, mà sẽ giúp đỡ về phân tích, làm ngày toán, định dạng ...

+4

không công cụ xung quanh với những ngày người. Chỉ cần sử dụng moment.js và lưu mái tóc của bạn. –

3

Làm việc với ngày tháng trong javascript luôn luôn là một chút rắc rối. Tôi luôn luôn sử dụng thư viện. Moment.js và XDate đều lớn:

http://momentjs.com/

http://arshaw.com/xdate/

Fiddle:

http://jsfiddle.net/39fWa/

var $output = $('#output'), 
    tomorrow = moment().add('days', 1); 

$('<pre />').appendTo($output).text(tomorrow); 

tomorrow = new XDate().addDays(-1); 

$('<pre />').appendTo($output).text(tomorrow); 

+0

Tôi đã nhìn thấy thời điểm khi moment.js tính số tháng không hợp lệ trong khoảng thời gian ngày (khác) - ví dụ: giữa ngày 13 tháng 2 năm 2014 và ngày 15 tháng 3 năm 2016 - moment.js sẽ báo cáo rằng có 26 tháng khi hầu hết các ngôn ngữ được xây dựng trong các lớp Date hoặc DateTime của một số loại sẽ báo cáo khoảng thời gian tương tự như 25. XDate dường như để tính toán khoảng thời gian đó một cách chính xác mặc dù. – AndrewPK

4
//In order to get yesterday's date in mm/dd/yyyy. 


function gimmeYesterday(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() - parseInt(toAdd)); 
var yesterDAY = (d.getMonth() +1) + "/" + d.getDate() + "/" + d.getFullYear(); 
$("#endDate").html(yesterDAY); 
     } 
$(document).ready(function() { 
gimmeYesterday(1); 
}); 

bạn có thể thử tại đây: http://jsfiddle.net/ZQAHE/

32

Bạn cần sử dụng getTime()setTime() để thêm hoặc trừ thời gian trong đối tượng Ngày javascript. Sử dụng setDate()getDate() sẽ dẫn đến sai sót khi đạt đến giới hạn của những tháng 1, 30, 31, vv ..

sử dụng setTime cho phép bạn thiết lập một bù đắp trong mili giây, và để cho các con số ngày đối tượng còn lại:

var now=new Date(); 
var yesterdayMs = now.getTime() - 1000*60*60*24*1; // Offset by one day; 
now.setTime(yesterdayMs); 
+2

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Hàm tạo ngày dường như hoạt động lạ khi một số âm được sử dụng cho chỉ mục ngày. Tôi tìm thấy cách duy nhất để giải quyết nó là làm việc với mili giây trực tiếp –

+0

Giải pháp tốt nhất !. Tất cả các giải pháp khác sử dụng setDate nên được downvoted ... có thể đã an toàn cho tôi rất nhiều rắc rối ... – abimelex

+0

Ditto. Đây là giải pháp sạch và đáng tin cậy nhất. Cảm ơn bạn @decasteljau – GR7

2

Cách tôi thích, là nếu bạn có đối tượng ngày, bạn có thể trừ một đối tượng ngày khác khỏi đối tượng đó để có sự khác biệt. Các đối tượng ngày được dựa trên mili giây từ một ngày nhất định.

var date1 = new Date(2015, 02, 18); // "18/03/2015", month is 0-index 
var date2 = new Date(2015, 02, 20); // "20/03/2015" 

var msDiff = date2 - date1; // 172800000, this is time in milliseconds 
var daysDiff = msDiff/1000/60/60/24; // 2 days 

Vì vậy, đây là cách bạn trừ ngày. Bây giờ nếu bạn muốn thêm chúng? date1 + date2 đưa ra một lỗi .. Nhưng nếu tôi muốn lấy thời gian bằng ms, tôi có thể sử dụng:

var dateMs = date1 - 0; 
// say I want to add 5 days I can use 
var days = 5; 
var msToAdd = days * 24 * 60 * 60 * 1000; 
var newDate = new Date(dateMs + msToAdd); 

Bằng cách trừ 0 bạn chuyển đối tượng ngày sang định dạng mili giây.

0

Điều tôi đang sử dụng (cần thiết), trong tập lệnh của tôi tôi cần nó cho ngày hiện tại, nhưng tất nhiên bạn có thể chỉnh sửa nó cho phù hợp.

HTML:

<label>Date:</label><input name="date" id="dateChange" type="date"/> 
<input id="SubtractDay" type="button" value="-" /> 
<input id="AddDay" type="button" value="+" /> 

JavaScript:

var counter = 0; 

$("#SubtractDay").click(function() { 
    counter--; 
    var today = new Date(); 
    today.setDate(today.getDate() + counter); 
    var formattedDate = new Date(today); 
    var d = ("0" + formattedDate.getDate()).slice(-2); 
    var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); 
    var y = formattedDate.getFullYear(); 
    $("#dateChange").val(d + "/" + m + "/" + y); 
}); 
$("#AddDay").click(function() { 
    counter++; 
    var today = new Date(); 
    today.setDate(today.getDate() + counter); 
    var formattedDate = new Date(today); 
    var d = ("0" + formattedDate.getDate()).slice(-2); 
    var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); 
    var y = formattedDate.getFullYear(); 
    $("#dateChange").val(d + "/" + m + "/" + y); 
}); 

jsfiddle

0
var date = new Date('your date string here'); // e.g. '2017-11-21' 

var newdate = new Date(date.getTime() + 24*60*60*1000 * days) // days is the number of days you want to shift the date by 

Đây là giải pháp duy nhất hoạt động đáng tin cậy khi thêm/trừ qua tháng và năm. Nhận ra điều này sau khi chi tiêu quá nhiều thời gian mucking xung quanh với các phương pháp getDate và setDate, cố gắng điều chỉnh cho sự thay đổi tháng/năm.

decasteljau (trong chủ đề này) đã trả lời điều này nhưng chỉ muốn nhấn mạnh tiện ích của phương pháp này vì 90% câu trả lời có đề xuất phương pháp getDate và setDate.

Các vấn đề liên quan