2010-11-08 47 views
11
var inputDate  = '20/4/2010'.split('/'); 
var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0])); 

var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year); 

Đây là mã Javascript tôi đang sử dụng để tính ngày hết hạn được cung cấp cho người dùng nhập ngày. Hiện tại, ngày hết hạn là original date minus one day and original year minus X.Trừ ngày/tháng/năm từ đối tượng Ngày

Các vấn đề với mã này, trước tiên, nó không tính đến các ngày không hợp lệ. Ví dụ: nếu ngày được người dùng cung cấp là '1/10/2010', ngày hết hạn sẽ là '0/10/2013' (giả sử ngày hết hạn là +3 năm).

tôi có thể làm một cái gì đó như:

var inputDate = '20/4/2010'.split('/'); 
var day  = parseInt(inputDate[0]); 
var month  = parseInt(inputDate[1]); 
var year  = parseInt(inputDate[2]); 

if (day < 1) 
{ 
    if (month == ...) 
    { 
     day = 31 
     month = month - 1; 
    } 
    else 
    { 
     day = 30 
     month = month - 1; 
    } 
} 

var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0])); 
var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year); 

Nhưng nhiều vấn đề phát sinh ... Thứ nhất, các mã được một chút phức tạp. Thứ hai, kiểm tra này sẽ phải được thực hiện trong ngày. và sau đó là tháng. Có cách nào sạch hơn, đơn giản hơn không?

Ngoài ra, có một trường hợp nhất định liên quan đến tôi cần tính ngày hết hạn cho đến cuối tháng đó cho ngày đó. Ví dụ:

Expiry date is: +3 years 

User date is: '14/10/2010' 
Expiry date is: '31/10/2013' 

Tôi đã hy vọng các Date object sẽ hỗ trợ những tính toán nhưng theo https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, có vẻ như không ...

+0

momentjs.com làm theo cách này dễ dàng hơn: http://momentjs.com/ – bernie2436

Trả lời

3
var currentDate = new Date(year,month,day); 
var expiryDate = new Date(); 
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000)); 

bằng số giây qua 1970 là tốt cho việc này: -) oh, bạn có nhiều quy tắc hơn. cũng sau đó bạn vẫn sẽ phải kiểm tra đối với những trường hợp ...

+1

Xin lỗi, tôi không hoàn toàn chắc chắn cách hoạt động ... Mỗi số đại diện cho những gì? Làm thế nào tôi sẽ tính toán +4 năm trên đầu trang của một ngày nhất định bằng cách sử dụng đó? – dave

11

Cách dễ dàng để xem nếu một ngày inputed là một ngày hợp lệ:

var d = Date.parse('4/20/2010'); 
if (isNaN(d.valueOf())) { 
alert ("bad date value"); 
} 

Sau đó, đây là một hàm dateAdd mà tôi sử dụng thường xuyên. Mở rộng đối tượng ngày, vì vậy nó dễ dàng để sử dụng:

Date.prototype.dateAdd = function(size,value) { 
    value = parseInt(value); 
    var incr = 0; 
    switch (size) { 
     case 'day': 
      incr = value * 24; 
      this.dateAdd('hour',incr); 
      break; 
     case 'hour': 
      incr = value * 60; 
      this.dateAdd('minute',incr); 
      break; 
     case 'week': 
      incr = value * 7; 
      this.dateAdd('day',incr); 
      break; 
     case 'minute': 
      incr = value * 60; 
      this.dateAdd('second',incr); 
      break; 
     case 'second': 
      incr = value * 1000; 
      this.dateAdd('millisecond',incr); 
      break; 
     case 'month': 
      value = value + this.getUTCMonth(); 
      if (value/12>0) { 
       this.dateAdd('year',value/12); 
       value = value % 12; 
      } 
      this.setUTCMonth(value); 
      break; 
     case 'millisecond': 
      this.setTime(this.getTime() + value); 
      break; 
     case 'year': 
      this.setFullYear(this.getUTCFullYear()+value); 
      break; 
     default: 
      throw new Error('Invalid date increment passed'); 
      break; 
    } 
} 

Sau đó, chỉ cần sử dụng:

var d = new Date(); 
d.dateAdd('day', -1).dateAdd('year', 3); 

T'da

+0

Tôi nghĩ câu trả lời này là giải pháp tốt nhất và ngày bạn đang phân tích cú pháp trong ví dụ là một chút đóng băng trên bánh. Cảm ơn! – TaeKwonJoe

+0

Chỉ cần một bình luận bên, xác thực là tốt, tuy nhiên không gọi nguyên mẫu với biến được phân tích cú pháp d. Bạn rõ ràng cần phải khởi tạo điều này thành một đối tượng Date. Nếu không, bạn sẽ nhận được lỗi goofy, của "dateAdd, không tồn tại." var d = Date(); d.dateAdd ('ngày', -1).dateAdd ('năm', 3); – MiloTheGreat

+0

Tôi nghĩ rằng đây không phải là giải pháp đúng. Tôi muốn người đó phải là người cao tuổi sau đó 18 năm dựa trên ngày sinh. đã cố gắng trừ 18 năm kể từ ngày hiện tại (28 tháng 3 năm 2014), giải pháp này đã trả về ngày 28 tháng 2 năm 1996. tôi vượt qua câu trả lời xác minh khỏi http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= và http: // www. calculator.net/date-calculator.html?today2=03%2F28%2F2014&c2op=-&c2year=18&c2month=0&c2week=0&c2day=0&calctype=op&x=98&y=11 ngày tôi nhận được 28-March-1996 Vì vậy, tôi nghĩ cái gì đó bị thiếu. –

5

Một câu hỏi tương tự đã được trả lời ở đây:

How to add/subtract dates with javascript?

Điều tương tự có thể được thực hiện trong nhiều tháng và nhiều năm.

Ví dụ:

 var date = new Date('2011','01','02'); 
    alert('the original date is '+date); 
    var newdate = new Date(date); 
    newdate.setMonth(newdate.getMonth() - 7); 
    var nd = new Date(newdate); 
    alert('the new date is '+nd); 
Các vấn đề liên quan