javascript - 使用 new Date() 比较和过滤当前日期中 MM/DD/YYYY 格式的数据,同时从用户输入值中减去 new Date()

标签 javascript angularjs datetime-format angularjs-filter datetime-comparison

尝试将 2015-02-21T21:48:48.137Z 格式的新日期(今天的日期)与 MM/DD/YYYY 格式的日期(即我的 json 数据)进行比较。我想根据用户输入的天数过滤今天之前的所有数据(在没有特定天数之前获取数据)。我可以获取天数并从今天的日期中减去它。不知道如何将此日期与 MM/DD/YYYY 格式的 Json 日期值进行比较。我应该解析 Date() 以便与 MM/DD/YYYY 格式的 JSON 数据进行比较

我可以使用 new Date() 获取用户输入并根据 2015-02-20T21:48:48.137Z 格式从今天的日期中减去它。我的数据是 MM/DD/YYYY 格式,因此需要一种比较方法减去 MM/DD/YYYY 格式的日期后得到的值。我是否需要更改过滤器中的参数并通过 ng-model 输入日期和值。

http://plnkr.co/edit/unB6m8ZyqGnmiYfeaLoP?p=preview

// Code goes here

var app = angular.module('tempfilter', []);

app.controller('MainCtrl', function($scope) {
  $scope.sensordata = [{
    name: 'Rob',
    "Date": "2015-02-15",
    "Temp": 42
  }, {
    name: 'Bob',
    "Date": "2015-02-19",
    "Temp": 50
  }, {
    name: 'Tom',
    "Date": new Date().getDate(),
    "Temp": 60
  }, {
    name: 'Sinclair',
    "Date": new Date(),
    "Temp": 65
  }];
  $scope.filter = {
    value: 2
  };

});

app.filter('tempo', function() {
  return function(items, field, value) {
    var filtered = [];
    var d = new Date(); // today!
    !d.setDate(d.getDate() - value); //date before today

    angular.forEach(items, function(item) {
      if (item[field] <= d) {
        filtered.push(item);
      }
    });
    return filtered;
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"></script>
<!DOCTYPE html>
<html ng-app="tempfilter">

<head lang="en">
  <meta charset="utf-8">
  <title>DateFilter</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
  <script>
    document.write('<base href="' + document.location + '" />');
  </script>
  <script src="script.js"></script>

</head>

<body ng-controller="MainCtrl">
  Number of days before today
  <input type="number" ng-model="filter.value">
  <p id="demo">Showing values lower than {{ filter.value }}</p>
  Filtered list:
  <ul>
    <li ng-repeat="s in sensordata | tempo:'Date':filter.value">{{s.Date|date:'MM/dd/yyyy'}} {{s.name}} {{s.Temp}}
    </li>
  </ul>

  Full List:
  <ul>
    <li ng-repeat="s in sensordata ">{{s.Date|date}} {{s.name}} {{s.Temp}}
    </li>
  </ul>
</body>

</html>

最佳答案

您可以使用以下方法解析 mm/dd/yyyy 中的日期:

function parseMDY(s) {
  var b = s.split(/\D/);
  return new Date(b[2], b[0]-1, b[1]);
}

请注意,IE 8 不支持解析 OP 中的格式,通常认为使用 Date 构造函数或 Date.parse 解析日期字符串是个坏主意。

此外,像 2015-02-15 这样的字符串在符合 ES5 的浏览器中可能会被解析为本地时间,而在符合 ed 的浏览器中可能会被解析为 UTC。 6 稿。

我不明白你用过什么:

!d.setDate(d.getDate() - value);

! 运算符似乎是多余的。

编辑

从OP来看,您似乎正在尝试解析像2015年2月15日这样的日期,为此您可以使用:

// Parse MM d, y
function parseMDY(s) {
  var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,
                jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
  var b = s.split(/[\s,]+/);
  return new Date(b[2], months[b[0].toLowerCase()], b[1]);
}

您可以通过 new Date() 获取当前日期,但这也将包含当前时间。您可以将时间部分归零,减去所需的时间段,然后进行比较。

例如如果您想过滤超过 2 天前的日期字符串:

// Start with the current date and time
var epoch = new Date();

// Set the time to 00:00:00.0
epoch.setHours(0,0,0,0);

// Subtract 2 days
epoch.setDate(epoch.getDate() - 2);

// Compare with string
if (epoch > parseMDY(dateString)) {
  // dateString is more than 2 days before epoch
}

关于javascript - 使用 new Date() 比较和过滤当前日期中 MM/DD/YYYY 格式的数据,同时从用户输入值中减去 new Date(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639009/

相关文章:

Javascript/jQuery 在单击时更改 CSS 不起作用

javascript - Angular 如何一次编辑数组中的所有元素

javascript - Controller 中的窗口调整大小设置变量不起作用

PHP DateTime::diff 问题与 DateTime::format

ruby - 使用 Ruby 格式化日期时间问题

javascript - 无法自动隐藏更新面板内的标签(div 弹出屏幕)

javascript - 'this' 在 setImmediate 调用中丢失?

javascript - 使用 *ngfor 的多个选择标签更改第一个选择标签值会影响其他选择标签

javascript - Angularjs:当使用 ng-value 时,value = 0?

c# - 从 C# 到 MySql 格式的日期转换