日期对象的行为不符合预期

时间:2017-05-03 14:17:42

标签: javascript date datetime

我有一个控件,显示我的应用程序开始时的当前月份和年份。它有2个按钮,可以在当前月份中加1或减1。我使用相同的函数来添加/减去初始化日期,方法是用0调用它。这是函数:

$_POST['address']

我想在此添加2个全局变量。启动/ EndOfRange。他们必须存储该月的第一天和最后一天。您可以看到相当多的代码被注释掉了,我一直在尝试在网上找到很多不同的例子。我停留在setDate()(也许它不在我提供的代码中,我确实尝试使用它但无法使其工作)功能。如果我用param 1调用它,它会将日期设置为30.我也尝试过UTC时间。

奇怪的是,当我使用警报时,它会显示为1。当我使用console.log时,它没有。我尝试了从1到30的所有值,它们都给出了模糊的意外结果。

从w3(https://www.w3schools.com/jsref/jsref_obj_date.asp)读取我正确地调用它。我设法通过构造一个新的日期对象来设置为-29,从而获得正确的日期。日期(或日期,位混淆,第三个参数)设置为-29。似乎始终将日期设置为1,但不是长期解决方案。

2 个答案:

答案 0 :(得分:0)

您可以使用以下两个功能查找当月的第一天和最后一天。

$scope.StartOfRange = $scope.getFirstDay();    
$scope.EndOfRange = $scope.getLastDay();
$scope.getFirstDay = function ()
{
    var currDate = new Date();     
    year = currDate.getFullYear();
    month = currDate.getMonth();
    day = currDate.getDate();
    var lastMonth = month - 1;
    if (month == 0) {
        year--;
        lastMonth = 11;
    }
    lastDay = 28;
    var previousMonthDate = new Date(year, lastMonth,lastDay);

    while (previousMonthDate < currDate)
    {
        previousMonthDate = new Date(year, lastMonth, lastDay++);
        var curMonth = previousMonthDate.getMonth();
        if (curMonth == month)
        {
            console.log("First Day :" + previousMonthDate);
            return previousMonthDate;
        }
    }
}
$scope.getLastDay = function () {
    var currDate = new Date();
    year = currDate.getFullYear();
    var nextYear = year;
    month = currDate.getMonth();
    day = currDate.getDate();
    var nextMonth = month + 1;
    if (month == 11) {
        nextYear++;
        nextMonth = 0;
    }
    lastDay = 28;
    var currentMonthDate = new Date(year, month, lastDay);
    var nextMonthDate = new Date(nextYear, nextMonth, 1);
    while (currentMonthDate < nextMonthDate) {
        var finalDate = currentMonthDate;
        currentMonthDate = new Date(year, month, lastDay++);
        var curMonth = currentMonthDate.getMonth();
        if (curMonth == nextMonth) {
            console.log("LastDay :" + finalDate);
            return finalDate;
        }
    }
}

答案 1 :(得分:0)

使用此代码:

$scope.SetDateMonth = function (modifier) {
        if (modifier === 0) {
            //initialize the current date, only called on load
            $scope.CurrentDate = new Date();

        } else {
            //alter the currentdate
            $scope.CurrentDate.setMonth($scope.CurrentDate.getMonth() + modifier);
        }

        //set startofrange to first day of month
        $scope.StartOfRange = new Date($scope.CurrentDate.getFullYear(), $scope.CurrentDate.getMonth(), 1);
        //this sets the date to the last day of the previous month. Bc. we add 1 to the month, this will result in the last day of CurrentMonth
        $scope.EndOfRange = new Date($scope.CurrentDate.getFullYear(), $scope.CurrentDate.getMonth()+1, 0); 
        console.log("Start");
        console.log($scope.StartOfRange);
        console.log("End");
        console.log($scope.EndOfRange);
   }

检查firefox和Internet Explorer中的控制台输出。由于当前日期是4-5-2017,StartOfRange应为1-5-2017,EndOfRange应为31-5-2017。

的FireFox:

Start
Date 2017-04-30T22:00:00.000Z
End
Date 2017-05-30T22:00:00.000Z

IE:

Start
[date] Mon May 01 2017 00:00:00 GMT+0200
End
[date] Wed May 31 2017 00:00:00 GMT+0200

如果让firefox使用相同的代码,我会编辑。

编辑1: 添加了这段代码:

var test = $scope.CurrentDate;
test.setDate(1);
console.log("test:");
console.log(test);

由于某种原因,这可以正常工作。但是,它不仅设置测试的日期,因为它是对CurrentDate的引用。我不明白为什么这会起作用,但在构造函数中将date设置为1不会..