使用JS和moment操作日期/时间

时间:2018-12-05 19:38:19

标签: javascript datetime momentjs

我有2个日期,我需要使用这2个日期创建第3个日期。

if (document.getElementById("endDate"))
endDate = document.getElementById("endDate").value;

if (document.getElementById("presentDate"))
presentDate = document.getElementById("presentDate").value;

如果Present date = "12/5/2018"End date = "12/25/2018",那么我的New date = "12/26/2018";

由于JavaScript日期月份的范围是0-11,而且日期有点乱,所以我没有得到想要的结果。

我尝试过的事情:

var presentDt = new Date(presentDate);
var endDt = new Date(endDate);

var newDay = endDt.getUTCDate()+1; 
var presentMonth = presentDt.getUTCMonth();
var presentYear = presentDt.getUTCFullYear();
var nextDate= presentMonth + '/' + endDay + '/' + presentYear;
  • 问题1:上面的代码有效,但是如果我的endDate位于31号,则添加UTCDate+1使其成为32,这将返回无效的日期。

  • 问题2:如果我执行UTCMonth(),则返回11,但是如果我要加上2个月,则返回13,这也是无效的。问题基本上是我无法根据需要操纵日期。

我也试过了片刻,但是我遇到了类似的问题,而且我无法轻松地按他们希望的方式操作日期。

也尝试过getDategetMonth,但它做的是相同的事情。

是否有使用JavaScript处理总日期/时间的更好方法?

3 个答案:

答案 0 :(得分:0)

1:加减天数:     new Date(new Date()。setDate(new Date()。getDay()+ 3))

2:添加/减去月份:     new Date(new Date()。setMonth(new Date()。getMonth()+ 3))

//your code
var presentDt = new Date(presentDate);
var endDt = new Date(endDate);

var newDay = new Date(new Date().setDate(endDt.getDay() + 2)); 
var presentMonth = presentDt.getUTCMonth();
var presentYear = presentDt.getUTCFullYear();

答案 1 :(得分:0)

由于您的输入字符串在整个环境中都不是new Date()可以识别的格式,因此建议您使用moment(String, String)进行解析。

然后,您可以使用moment(Object),时刻设定器(例如year()month()date())和format()来获得所需的输出。

这里有一个现场样本:

var presentDt = "12/5/2018";
var endDt = "12/25/2018";

// Parse your input with momentjs
var mPresent = moment(presentDt, "MM/DD/YYYY");
var mEnd = moment(endDt, "MM/DD/YYYY");

// Create a new momnt object compliant with your needs
var nextDate = moment({
  year: mPresent.year(), // get presentDt's year
  month: mPresent.month(), // get presentDt's month
  date: mEnd.add(1, 'day').date() // get endDt day of the month and add 1 day to it
});

// Display the result in the format you need
console.log(nextDate.format("MM/DD/YYYY"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

请注意,当01代表一个月的最后一天时,您将获得endDt作为一天的结果。

答案 2 :(得分:0)

这就是我所做的:

首先,我创建了以下函数来查看天数和月数。

 function formattedDate(date) {
        var day = date.getDate();
        var monthIndex = date.getMonth();
        var year = date.getFullYear();

        return (monthIndex + 1) + '/' + day + '/' + year;
    }
    function myNewDate(datestring) {
        var dates = datestring.split("/");
        var year, month, day;
        if (dates.length < 3) {
            dates = datestring.split("-");
            year = dates[0];
            month = dates[1] - 1;
            day = dates[2];
        } else  {
            year = dates[2];
            month = dates[0] - 1;
            day = dates[1];
        }


        var days = [31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31];
        // Overflow day
        if (day > days[month])
            day = days[month];

        return new Date(year, month, day);
    }
    function newDate(date1, date2) {
        var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        var year = date1.getFullYear();
        var month = date1.getMonth() + 1;
        var day = date2.getDate() + 1;


        // Check leap year
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
            days[1] = 29;

        // Overflow day
        if (day > days[month])
            day = days[month];

        var newdate = new Date(year, month, day);

        return newdate;
    }

在这里,我使用上述功能创建了新日期。您还可以通过更新上面的内容来添加/减去天/月。

        var mpresent = myNewDate(presentDate);
        var mstart = myNewDate(startDate);
        var myDate =  (formattedDate(newDate(mpresent, mstart)));