【问题标题】:Check if time difference is less than 45 mins and run function - AngularJS检查时差是否小于 45 分钟并运行函数 - AngularJS
【发布时间】:2016-03-09 12:53:08
【问题描述】:

在 PHP 中使用这样的代码很容易做到这一点;

if (strtotime($given_time) >= time()+300) echo "You are online";

但是在 SO 上找不到任何东西可以在 javascript 中完全做到这一点。 我想检查给定时间和当前时间之间的差异是否小于 45 分钟

例如

$scope.given_time = "14:10:00"
$scope.current_time = new Date();

我只关心时间部分。我需要从new Date(); 中提取时间部分,然后进行比较。

那么这应该是true

如何使用 Javascript 实现这一点:

if ($scope.given_time - $scope.current_time < 45 minutes) {
   // do something
}

【问题讨论】:

  • 日期对象可以使用getMinutes()
  • 你尝试过使用像moment.js这样的插件吗?
  • 多久检查一次时差?如果您使用 window.setInterval 并每分钟检查一次,则可以使用 getMinutes() 函数并以这种方式进行比较。
  • @www139 我会检查每个页面加载...

标签: javascript php angularjs


【解决方案1】:

使用像 moment.js 这样的库,您可以简单地区分两次。

var $log = $("#log");

/* Difference between just times */
$log.append("Difference between times\n");
var givenTime = moment("14:10:00", "HH:mm:ss");
var minutesPassed = moment("14:30:00", "HH:mm:ss").diff(givenTime, "minutes");

$log.append("Minutes passed: " + minutesPassed + "\n");

if (minutesPassed < 45) {
  $log.append(minutesPassed + " minutes have elapsed. Event Triggered." + "\n");
}


/* Better: Difference between times that have dates attached to them and cross a day boundary. */
$log.append("\n\nDifference between dates with times\n");
givenTime = moment("2015-12-03 23:33:00");
minutesPassed = moment("2015-12-04 00:14:00").diff(givenTime, "minutes");

$log.append("Minutes passed: " + minutesPassed + "\n");

if (minutesPassed < 45) {
  $log.append(minutesPassed + " minutes have elapsed. Event Triggered." + "\n");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://momentjs.com/downloads/moment.js"></script>
<p>Results:</p>
<hr>
<pre id="log"></pre>
<hr>

警告:如果给定时间是昨天,例如11:30pm,而当前时间是12:10am em> 那么你会得到错误的结果。如果这种类型的事情对您的用例来说是个问题,您可能希望使用带有时间的日期。

moment.js 文档

http://momentjs.com/docs/

用于时刻文档的 Angular 指令

https://github.com/urish/angular-moment/blob/master/README.md

【讨论】:

  • 您能否更新您的代码以包含日期。我也可以在 Angular 中使用普通的 moment 库吗?
  • @moh.ABK 我已经用日期更新了它,但您必须更改它以使用您的日期格式。如果您使用 angular-moment 指令,那么您应该已经可以访问应用程序中的 moment()。你只需要将它注入到你的构造函数中。
【解决方案2】:

试试这个:

function checkTime(time) {
  var date = new Date();
  var date1 = new Date((date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear() + " " + time);

  var minutes = (date1.getTime() - date.getTime()) / (60 * 1000);

  if (minutes > 45 || (minutes < 0 && minutes > -1395)) { 
  // greater than 45 is todays time is above 45 minutes
  // less than 0 means the next available time will be tomorrow and the greater than -1395 means it will be more than 45 minutes from now into tomorrow

    document.write(time + ': true<br />');
  } else {
    document.write(time + ': false<br />');
  }
}

checkTime("14:10:00");
checkTime("16:30:00");
checkTime("17:10:00");

【讨论】:

  • 您能否修改此功能以检查当前时间(包括日期)是否超过给定时间...谢谢
  • @moh.ABK 你能问一个新问题吗,因为它会改变这个问题
【解决方案3】:

有一个 JavaScript 方法叫做 getMinutes();您可以使用它只获取分钟并进行比较。

您的代码应该类似于:

    var received_time = "14:10:00".split(':');
    var minute = '';  
    if(received_time.length === 3) {
      minute = parseInt(received_time[1], 10);
   }
    $scope.given_time = minute;
    var the_time = new Date();
    $scope.current_time = the_time.getMinutes();

你现在可以做你的事了:

if ($scope.given_time - $scope.current_time < 45 minutes) {
   // do something
}

【讨论】:

  • 这不能很容易地用来计算差异。 11:01 将返回 1,10:59 将返回 59。
  • -58 与 45 比较,因为 OP 想要的应该可以工作,因为显然 -58 小于 45
  • 我想在这种情况下它会起作用,但它在逻辑上没有意义。尝试不同的数字。 9:50 和 10:40。 50 分钟过去了,但应该是 -10 分钟。
【解决方案4】:

Javascript 使用以毫秒为单位的 unix 时间戳,因此它类似于 strtotime 的输出(使用秒)。

var date = new Date();

然后你需要从毫秒开始计算。 (分钟 * 60 * 1000)

您也可以使用date.parse() 将字符串解析为毫秒,就像PHP 中的strtotime() 解析为秒一样。

全文:

var date = new Date();
var last = new Date('Previous Date'); // or a previous millisecond timestamp
if ( ( date - last ) > ( 45 * 60 * 1000 ) ) {
   // do something
}

您可以使用静态日期来比较时间,如果您排除日期,这正是 strtotime 所做的:

var last = new Date('1/1/70 14:10:00');
var date = new Date('1/1/70 14:30:00');

但是,如果您尝试比较跨越日期边界的时间,这种方法将失败。

【讨论】:

  • 我不想考虑date.. 几分钟。 new Date() 会给你完整的日期字符串
  • @moh.ABK 您不必在计算中使用完整的日期字符串,您可以使用静态日期,但您应该这样做。如果时间框架跨越几天会发生什么?晚上 11:59 与上午 12:01。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多