Javascript 将本地JS转换为Angularjs以计算两个日期之间的天数?
我在尝试转换或翻译原生js脚本以计算两个范围(“工作开始”和“工作结束”)中两个日期之间的天数时遇到困难,但没有成功 下面是代码,实际上它是有效的,但是在console.log中触发了一个警报,我没有实现解决这个问题Javascript 将本地JS转换为Angularjs以计算两个日期之间的天数?,javascript,angularjs,Javascript,Angularjs,我在尝试转换或翻译原生js脚本以计算两个范围(“工作开始”和“工作结束”)中两个日期之间的天数时遇到困难,但没有成功 下面是代码,实际上它是有效的,但是在console.log中触发了一个警报,我没有实现解决这个问题 $scope.$watchGroup(['work_start', 'work_end'], function() { var date1 = $scope.work_start; var date2 = $scope.work_end; // First we split th
$scope.$watchGroup(['work_start', 'work_end'], function() {
var date1 = $scope.work_start;
var date2 = $scope.work_end;
// First we split the values to arrays date1[0] is the year, [1] the month and [2] the day
date1 = date1.split('-');
date2 = date2.split('-');
// Now we convert the array to a Date object, which has several helpful methods
date1 = new Date(date1[0], date1[1], date1[2]);
date2 = new Date(date2[0], date2[1], date2[2]);
// We use the getTime() method and get the unixtime (in milliseconds, but we want seconds, therefore we divide it through 1000)
date1_unixtime = parseInt(date1.getTime() / 1000);
date2_unixtime = parseInt(date2.getTime() / 1000);
// This is the calculated difference in seconds
var timeDifference = date2_unixtime - date1_unixtime;
// in Hours
var timeDifferenceInHours = timeDifference / 60 / 60;
// and finaly, in days :)
var timeDifferenceInDays = timeDifferenceInHours / 24;
// alert(timeDifferenceInDays);
$scope.total_days = timeDifferenceInDays;
}))
这是我收到的警报:
angular.js:13283 TypeError: Cannot read property 'split' of null
at app.js:3997
at c (angular.js:16419)
at m.$eval (angular.js:16884)
at m.$digest (angular.js:16700)
at m.$apply (angular.js:16992)
at g (angular.js:11313)
at y (angular.js:11511)
at XMLHttpRequest.t.onload (angular.js:11452)(anonymous function) @ angular.js:13283(anonymous function) @ angular.js:9996m.$digest @ angular.js:16702m.$apply @ angular.js:16992g @ angular.js:11313y @ angular.js:11511t.onload @ angular.js:11452
我改变了一些事情,但这是我能做到的。欢迎任何帮助
这意味着您试图在非字符串的对象上使用该函数。那么,您在哪里使用split函数呢
date1 = date1.split('-');
date2 = date2.split('-');
那么date1/2是在哪里定义的呢
var date1 = $scope.work_start;
var date2 = $scope.work_end;
那么$scope.work\u start
/end
在哪里定义?不确定,但可能是html格式的。要简单地解决此问题,请执行以下操作:
if(date1 === null || date2 === null){
alert("no dates given")
} else {
date1 = date1.split('-');
date2 = date2.split('-');
... // rest of your code
}
根据下面的讨论更新此部分 在JS中可能是一种痛苦。新初始化的日期对象只是自1970年1月1日(UTC)以来的毫秒数。如果你想玩日期和时间,可以看看js库,它可以让日期更容易处理 监视这两个日期,如果其中一个发生更改,则运行“间隔天数”功能。这很好,但是您必须补偿一系列问题,例如 用户在
工作结束
之前更改工作开始
,工作开始
在工作结束
用户输入的日期格式不正确
还有一大堆其他可能出现的东西。您可能需要考虑合并一个按钮,允许用户在编辑完这两个日期后更新日期。这还允许表单错误检查输入,如果格式不正确,则不允许提交
HTML
感谢“”用于getDaysBetween逻辑。看起来好像不总是设置
work\u start
或work\u end
。如果(!work_start | | | |!work_end){total_days=null;return;}可以添加一个简单的条件,看看它是否有用。抱歉@Claies,此错误是由于来自另一个块的console.log引起的,该值尚未定义,这就是它未定义的原因。但这与上面粘贴的代码无关(两个日期之间的天数),还请注意,回调函数可以具有form函数(newValues,oldValues,scope)
,因此您可以从newValues
读取值,而不是从newValues
读取值,例如work_start=newValues[0];work\u end=newValues[1]
(我的意思是只需在函数中添加参数newValue
)如果$scope.work\u start
和$scope.work\u end
的值是格式为“MM-dd-yyyy”的字符串格式的日期,则此代码可以正常工作。这个错误似乎是不言自明的;其中一个作用域属性是null
。那么,这里的问题是什么?我解决了这个问题,考虑到空值,如果它们不存在,给它们一个0的值。这是一个暂时的解决方案,我将按照@Travis的建议进行处理,以生成一个更紧凑的代码,使用适当的角度标记。谢谢,这似乎暂时解决了问题,但我确实需要做的是与您建议的角度典型标记相同的事情。对于我在html中的输入,我有:
,最后:
值取自此处。很高兴提供帮助,如果我回答了您的问题,请确保单击检查。此外,如果您不知道,Date
对象在js中是一个大麻烦-它们有一个陡峭的学习曲线。如果你在约会/时间上做了很多事情,那就去看看或者。此外,它看起来像一个侦听器,因此当其中一个值发生更改时,它将运行该函数。一个很好的方法,但是,再一次,约会可能是一个婊子。谢谢你,我会看看那些,(糖和时刻),顺便说一下,关于学习JS和Angular,我前面还有很长的路要走。我肯定会发布更多的问题和疑问!
if(date1 === null || date2 === null){
alert("no dates given")
} else {
date1 = date1.split('-');
date2 = date2.split('-');
... // rest of your code
}
<div ng-controller="workCont">
<input ng-model="$scope.work_start"></input>
<input ng-model="$scope.work_end"></input>
<button ng-click="$scope.getDaysBetween()">Get Days Between</button>
<p>Days Between: {{$scope.daysBetween}}</p>
</div>
var workApp = angular.module('workApp', []);
workApp.controller('workCont', function workCont($scope) {
$scope.work_start = new Date();
$scope.work_end = new Date();
$scope.daysBetween = 0;
$scope.getDaysBetween = function(){
var date1 = $scope.work_start
var date2 = $scope.work_end
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
$scope.daysBetween = diffDays
}
});