2012-06-07 11 views
63

Chcę umożliwić użytkownikom łatwe dodawanie i odejmowanie dat za pomocą JavaScript w celu przeglądania ich wpisów według daty.Jak dodawać/odejmować daty za pomocą JavaScript?

Daty są w formacie: "mm/dd/rrrr". Chcę, aby mogli kliknąć przycisk "Dalej", a jeśli data jest: "06/01/2012", a następnie po kliknięciu następnej, powinna to być: "06/02/2012". Jeśli klikną przycisk "prev", wówczas powinien to być "05/31/2012".

Trzeba śledzić lata przestępne, liczbę dni w miesiącu, itp

Jakieś pomysły?

P.S za pomocą AJAX, aby uzyskać datę z serwera nie jest opcją, jest nieco opóźniony, a nie doświadczenie dla użytkownika, że ​​klient chce.

+1

jeśli korzystasz z datepika. następnie 'dateValue = $ .datepicker.parseDate (" mm/dd/rr ", '06/01/2012 ');' 'dateValue.setDate (dateValue.getDate() + 1);' –

Odpowiedz

83

Kod:

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

Korzystanie 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

Dodatkowe rzeczy, które mogą się przydać:

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) 

Dobry Link:MDN Date

+0

Po co tworzyć 3. nową datę : var nd = new Date (newdate) ?? Obiekt daty, newdate, dostosowany przez .setDate, jest w porządku, prawda? –

+0

@KevinM yep, zależy od celu, więc 'nd' to nowa data' var' została właśnie stworzona dla jasności! ':)' –

1

Możesz użyć macierzystego obiektu javascript Date, aby śledzić daty. Daje ci aktualną datę, pozwala śledzić kalendarz, a nawet pomaga zarządzać różnymi strefami czasowymi. Możesz dodawać i odejmować dni/godziny/sekundy, aby zmienić datę pracy lub obliczyć nowe daty.

spojrzeć na tego odniesienia obiektu, aby dowiedzieć się więcej:

Date

nadzieję, że pomoże!

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


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

Może być to może pomóc

<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

Przedmiotem JavaScript Date może pomóc tutaj.

Pierwszym krokiem jest zamiana tych ciągów na instancje Date. Można to łatwo zrobić:

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 

Następnie można wykonać wiele przydatnych obliczeń. Daty JavaScript rozumieją lata przestępne i takie. Używają wyidealizowanej koncepcji "dnia", która wynosi dokładnie 86 400 sekund. Ich podstawową wartością jest liczba milisekund od epoki (północ, 1 stycznia 1970 r.); może to być liczba ujemna dla dat sprzed epoki.

Więcej o MDN page on Date.

Można również rozważyć użycie biblioteki jak MomentJS, która pomoże w analizowanie, robi datę matematyki, formatowanie ...

+4

Nie pakuj rzeczy z datami ludzi. Po prostu użyj pliku momen.js i zapisz włosy. –

3

Praca z datami w JavaScript jest zawsze trochę kłopotów. I zawsze kończy się przy użyciu biblioteki. Moment.js i XDate są zarówno wielkie:

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

Widziałem czasy, gdy moment.js oblicza niepoprawną liczbę miesięcy w interwale daty (diff) - na przykład między datami 13 lutego 2014 r. A 15 marca 2016 r. - moment.js zgłosi, że jest 26 miesiące, gdy większość języków z wbudowanymi klasami Date lub DateTime będzie zgłaszać ten sam interwał co 25. Wydaje się, że XDate poprawnie oblicza ten interwał. – 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); 
}); 

możesz wypróbować tutaj: http://jsfiddle.net/ZQAHE/

32

Trzeba użyć getTime() i setTime() dodać lub odjąć czas w javascript obiektu Date. Korzystanie setDate() i getDate() będzie prowadzić do błędów przy osiągnięciu granic miesiącach 1, 30, 31, itd ..

Korzystanie setTime umożliwia ustawienie przesunięcia w milisekundach, a niech rysunek Data Object resztę:

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

To jedyne rozwiązanie, które sprawdziło się u mnie. Konstruktor Date zachowuje się dziwnie, gdy do indeksu dziennego używana jest liczba ujemna. Znalazłem jedyny sposób, aby rozwiązać problem polegający na pracy z milisekundami bezpośrednio –

+0

Najlepsze rozwiązanie !. Wszystkie pozostałe rozwiązania, które używają setDate, powinny zostać wycofane ... może mnie to zabezpieczyło wiele problemów ... – abimelex

+0

Ditto. Jest to najczystsze i bardziej niezawodne rozwiązanie. Dziękuję @decasteljau – GR7

2

Sposób, który mi się podoba, to to, że jeśli masz obiekt daty, możesz odjąć od niego inny obiekt daty, aby uzyskać różnicę. Data obiekty są na podstawie milisekund od określonej daty.

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 

W ten sposób odejmujesz daty. Teraz, jeśli chcesz je dodać? date1 + date2 daje błąd .. Ale jeśli chcę uzyskać czas w ms mogę użyć:

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

Odejmując 0 włączeniu obiekt data w formacie milisekund.

0

Coś używam (jQuery potrzebne), w moim skrypcie muszę go do bieżącego dnia, ale oczywiście można edytować go odpowiednio.

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 

Jest to jedyne rozwiązanie, które działa niezawodnie podczas dodawania/odejmowania całej miesiącach i latach. Zrealizowane to po spędzeniu zbyt wiele czasu mucking z getDate i metod setDate, starając się dostosować do zmian miesiąc/rok.

decasteljau (w tym wątku) już odpowiedział na to pytanie, ale chciał tylko podkreślić użyteczność tej metody, ponieważ 90% odpowiedzi tam poleca metody getDate i setDate.

Powiązane problemy