Как добавить /вычесть даты с помощью JavaScript?

Я хочу позволить пользователям легко добавлять и вычитать даты с помощью JavaScript, чтобы просматривать свои записи по дате.

Даты в формате: «мм /дд /гггг». Я хочу, чтобы они могли нажимать кнопку «Далее», а если дата: «06.01.2012», то при нажатии «Далее» она должна стать: «06.02.2012». Если они нажмут кнопку «предыдущая», то она должна стать «31.05.2012».

Необходимо отслеживать високосные годы, количество дней в месяце и т. д.

Есть идеи?

P.S, использующий AJAX для получения даты с сервера, не вариант, он немного запаздывает и не подходит для пользователя, которого хочет клиент.

66 голосов | спросил Click Upvote 7 J0000006Europe/Moscow 2012, 15:55:54

12 ответов


0

Код:

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

Использование 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

Дополнительные материалы, которые могут пригодиться:

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)

Хорошая ссылка: Дата MDN

ответил Tats_innit 7 J0000006Europe/Moscow 2012, 16:00:53
0

Вам нужно использовать getTime() и setTime() добавить или вычесть время в JavaScript-объекте Date. Использование setDate() и getDate() приведет к ошибкам при достижении пределов месяцев 1, 30, 31 и т. д.

Использование setTime позволяет установить смещение в миллисекундах и позволить объекту Date отображать остальное:

var now=new Date();
var yesterdayMs = now.getTime() - 1000*60*60*24*1; // Offset by one day;
now.setTime( yesterdayMs );
ответил decasteljau 25 AM00000050000002831 2013, 05:33:28
0
startdate.setDate(startdate.getDate() - daysToSubtract);


startdate.setDate(startdate.getDate() + daysToAdd);
ответил Romil Kumar Jain 7 J0000006Europe/Moscow 2012, 16:00:13
0

Здесь может помочь объект JavaScript Date.

Первый шаг - преобразовать эти строки в экземпляры Date. Это легко сделать:

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

Тогда вы можете делать всевозможные полезные вычисления. JavaScript даты понимают високосные годы и тому подобное. Они используют идеализированное понятие «день», которое точно длится 86 400 секунд. В основе их лежит количество миллисекунд, прошедших с начала эпохи (полночь, 1 января 1970 года); это может быть отрицательное число для дат, предшествующих эпохе.

Подробнее на странице MDN на Date

Вы также можете использовать библиотеку, например MomentJS , которая поможет с синтаксическим анализом, выполнением математики дат, форматированием ...

ответил T.J. Crowder 7 J0000006Europe/Moscow 2012, 16:04:42
0

Может быть, это может помочь

    <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);" />
ответил yogi 7 J0000006Europe/Moscow 2012, 16:02:23
0
//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);
});

вы можете попробовать здесь: http://jsfiddle.net/ZQAHE/

ответил thetallone 19 12012vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2012 20:16:41 +0400 2012, 20:16:41
0

Работа с датами в javascript всегда немного хлопотна. Я всегда заканчиваю тем, что использую библиотеку. Moment.js и XDate великолепны:

http://momentjs.com/

http://arshaw.com/xdate/

Скрипка:

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

ответил benvds 7 J0000006Europe/Moscow 2012, 16:12:05
0

Мне нравится то, что если у вас есть объект даты, вы можете вычесть из него другой объект даты, чтобы получить разницу. Объекты даты основаны на миллисекундах с определенной даты.

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

Так вот как вы вычитаете даты. Теперь, если вы хотите добавить их? date1 + date2 выдает ошибку. Но если я хочу получить время в мс, я могу использовать:

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

Вычитая 0, вы превращаете объект даты в миллисекунды.

ответил Jake Rowsell 18 MarpmWed, 18 Mar 2015 14:05:00 +03002015-03-18T14:05:00+03:0002 2015, 14:05:00
0

Вы можете использовать нативный объект Date для JavaScript, чтобы отслеживать даты. Это даст вам текущую дату, позволит вам отслеживать конкретные события календаря и даже поможет вам управлять различными часовыми поясами. Вы можете добавить и вычесть дни /часы /секунды, чтобы изменить дату, с которой вы работаете, или рассчитать новые даты.

посмотрите на ссылку на этот объект, чтобы узнать больше:

Date

Надеюсь, это поможет!

ответил Logard 7 J0000006Europe/Moscow 2012, 15:59:51
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

Это единственное решение, которое надежно работает при сложении /вычитании по месяцам и годам. Осознал это, потратив слишком много времени на изучение методов getDate и setDate, пытаясь приспособиться к сдвигам месяца /года.

decasteljau (в этой теме) уже ответил на это, но просто хочу подчеркнуть полезность этого метода, потому что 90% ответов там рекомендуют подход getDate и setDate.

ответил Suparna Gharpure 21 22017vEurope/Moscow11bEurope/MoscowTue, 21 Nov 2017 13:37:59 +0300 2017, 13:37:59
0

Что-то, что я использую (необходим jquery), в моем скрипте оно мне нужно на текущий день, но, конечно, вы можете отредактировать его соответствующим образом.

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

ответил 2 MarpmWed, 02 Mar 2016 18:13:45 +03002016-03-02T18:13:45+03:0006 2016, 18:13:45
0

Лучшая утилита для дат, которую я использовал, - это date-fns по нескольким причинам:

  • Использует собственный код JavaScript Date.
  • Неизменное; создается с использованием чистых функций и всегда возвращает новый экземпляр даты вместо изменения переданного.
  • Модульная; импортировать только те функции, которые вам нужны.

Менеджер пакетов:

"date-fns": "^1.30.1"

код:

import { addDays, subDays } from 'date-fns'

let today = new Date()
let yesterday = subDays(today, 1)
let tomorrow = addDays(today, 1)

Просто и круто.

ответил Matthew Steven Monkan 24 MonEurope/Moscow2018-12-24T17:29:17+03:00Europe/Moscow12bEurope/MoscowMon, 24 Dec 2018 17:29:17 +0300 2018, 17:29:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132