【问题标题】:Filtering Date in Javascript在 Javascript 中过滤日期
【发布时间】:2019-03-11 12:25:45
【问题描述】:

我正在尝试过滤包含大于特定日期的日期(从字符串转换)的数组..

_this.downloadData.forEach(_d => _d.LogTime = _d.LogTime.toString());

console.log(_this.downloadData.filter(x=>new Date(x.LogTime) > new Date('3/11/2019 7:29:12 AM')));

但过滤器总是返回零个项目

.

数组如下所示:

[0 … 99]
0:
CPUStat:""
Connectivity:""
DiskStatus:""
HostName:"HOSTname"
LastRebootStatus:null
LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)"

__proto__:
Object

【问题讨论】:

  • 没有,即使我有很多大于和小于Date('3/11/2019 7:29:12 AM') 的记录,它们都没有过滤,总是返回零
  • 你把数组中的日期转换成字符串后检查了吗?
  • LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)" 这是转换后的值
  • 您预计new Date('3/11/2019 7:29:12 AM') 的绝对时间是多少?它不表示时区。
  • 它的客户端脚本,所以我希望区域无关紧要

标签: javascript jquery string typescript date


【解决方案1】:

您的大部分问题都包括不符合 ISO 8601 的日期时间格式。因此,您需要清理日期。 LogTime.substring(4,23) + obj.LogTime.substring(28,33) 将从您的字符串中获取重要部分。然后你可以使用moment.js (https://momentjs.com),这是 JavaScript 处理时间的必备。

你可以运行下面的代码,看看它是否有效

// Your example time array
let timeArray = [
  { LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 08:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 09:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 10:39:12 GMT+0530 (India Standard Time)" }
 ],
 format = "MMM MM YYYY HH:mm:ssZ",
    shouldBeAfter = moment('Mar 11 2019 09:00:12+0530', format),
    result,
    filterDateGreaterThan = function (obj){
      let sDate,
          mDate;
      
      sDate = obj.LogTime.substring(4,23) + obj.LogTime.substring(28,33);
      mDate = moment(sDate, format);
      // console.log(mDate);
      return mDate.isAfter(shouldBeAfter);
    };
 result = timeArray.filter(filterDateGreaterThan);
 console.log(result);
<script src="https://momentjs.com/downloads/moment.min.js"></script>

不使用 Moment.js 时的代码

// Your example time array
let timeArray = [
  { LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 08:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 09:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 10:39:12 GMT+0530 (India Standard Time)" }
 ],
    shouldBeAfter = new Date('Mar 11 2019 09:00:12+0530'),
    result,
    filterDateGreaterThan = function (obj){
      let sDate,
          date;
      
      sDate = obj.LogTime.substring(4,23) + obj.LogTime.substring(28,33);
      date = new Date(sDate);
      return date.valueOf() > shouldBeAfter.valueOf();
    };
 result = timeArray.filter(filterDateGreaterThan);
 console.log(result);

【讨论】:

  • 这一刻有什么办法不做吗?
  • 我不能在代码中使用另一个组件,因为它需要多次批准
  • 是的,我在上面添加了代码。请记住,JS 文档是您最好的朋友 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)
  • 你真是个超级巨星!!脑洞大开的回答!谢谢!
【解决方案2】:

您应该能够通过在输入中添加时区来解决您的问题。如果您不提供时区,您的浏览器将使用您的本地时区。例如,我的时区是 PDT,所以我最终会看到:

Without Timezone in input:
input  : 3/11/2019 7:29:12 AM
output : Mon Mar 11 2019 07:29:12 GMT-0700 (Pacific Daylight Time)

With Timezone in input:
input  : Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)
output : Sun Mar 10 2019 19:09:12 GMT-0700 (Pacific Daylight Time)

请注意,使用输入中的时区,unix 时间戳与输出相匹配。


我个人使用Moment Timezone 处理这些情况。

Without Timezone in input:
input  : moment.tz("3/11/2019 7:29:12 AM", "Asia/Calcutta").toDate();
output : Mon Mar 11 2019 00:29:12 GMT-0700 (Pacific Daylight Time)

With Timezone in input:
input  : moment.tz("Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)", "Asia/Calcutta").toDate();
output : Mon Mar 11 2019 00:39:12 GMT-0700 (Pacific Daylight Time)

【讨论】:

  • 我试过 console.log(_this.downloadData.filter(x=>new Date(x.LogTime)=== "Wed Nov 14 06:02:48 GMT+0530 (India Standard Time) )"));但没有工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多