所以我在使用Javascript和JSON数据时遇到了这个问题。 当我从某个URL获取数据时,我将数据包含在带有字符串的JSON文件中。 现在我的问题是。这些字符串之一是我需要使用的日期,因此当该日期小于当前日期时,它将形成一个新的字符串,这样我就可以正确地将数据显示给我正在设计的HTML。 ?
我的项目的想法是,它显示当天列出的事件,而我只想显示即将发生的事件,而不是已经结束的事件。
注意日期为ISO_8601格式。我也是脚本新手。预先谢谢你。
答案 0 :(得分:1)
我不知道您的数据看起来如何,但是通常来说,您需要执行两个步骤:
转换非常简单,只需new Date(<ISO 8601 string>)
:
new Date("2018-06-12"); // -> Tue Jun 12 2018 01:00:00 GMT+0100
new Date("2018-07-13"); // -> Fri Jul 13 2018 01:00:00 GMT+0100
使用Array.filter
可以过滤掉过去的事件。您为它提供了一个返回True
或False
的函数,并为每个数组项运行它。函数返回True
返回的项目将放入新数组:
[1, 3, 4, 6, 7].filter(number => number > 4); // -> [6, 7]
[1, 3, 4, 6, 7].filter(number => number <= 4); // -> [1, 3, 4]
因此,要过滤过去的日期/时间,只需将它们与今天的日期进行比较。唯一棘手的事情是,将2018-06-07
这样的字符串(仅日期,未指定时间)赋给new Date(…)
,将时间设置为当前时间:
new Date("2018-06-07"); // -> Thu Jun 07 2018 01:00:00 GMT+0100
如果您只需要按天而不是数小时甚至数分钟进行比较,则可以方便地将时间设置为午夜之前:
(new Date("2018-06-07")).setHours(0) // -> Thu Jun 07 2018 00:00:00 GMT+0100
所以,当放在一起时:
const data = {
events: [
{ name: "Event 1", date: "2018-06-12" },
{ name: "Event 2", date: "2018-07-10" },
{ name: "Event 3", date: "2018-07-12" },
{ name: "Event 4", date: "2018-07-13" },
{ name: "Event 5", date: "2018-08-01" }
]
}
const today = (new Date()).setHours(0) // past midnight
const todayAndFutureEvents = data.events.filter(event => (new Date(event.date)) >= today);
console.log(todayAndFutureEvents);
如果您的事件跨越多个时区,则可能会出现另一个问题,但这可能超出了此问题的范围……
答案 1 :(得分:0)
如果将该字符串传递给新的Date(yourString)函数,它将返回一个JavaScript日期对象。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
示例:
const newDate = new Date('2008-09-15T15:53:00')
// Will return a date object with the value of:
// Mon Sep 15 2008 15:53:00 GMT-0700 (Pacific Daylight Time)
const currentDate = Date.now();
// Will return a date object with the current date.
console.log(newDate < currentDate);
// Will compare the two dates.
答案 2 :(得分:0)
嗯,您并没有真正提供有关JSON结构以及已经实现的目标的足够信息,因此,如果这还不够,请添加更多详细信息,但是我想是这样的:
var eventsFromMyJSONstring = JSON.parse(theJSONstringFetchedFromCertainURL);
var currentDate = new Date();
eventsFromMyJSONstring.forEach(function(iEvent) {
iEvent.newVarAsDate = new Date(iEvent.textDate);
if (iEvent.newVarAsDate >= currentDate) {
alert('hey, this object is from today or future');
}
});
编辑:另外,也许您想使用过滤器来获取当前和将来的事件……类似:
var currentAndFutureEvents = eventsFromMyJSONstring.filter((iEvent) => new Date(iEvent.textDate) >= new Date());
(假设那里有ES6 ...)
答案 3 :(得分:0)
正如Simeon所说,我的看法是相同的,我想补充一点点信息。
获得日期后,您需要做两件事,
您尚未添加有关示例日期JSON的问题,我假设您具有如下所示的JSON。
[
{name: "Something", date: "12-12-2018"},
{name: "Something", date: "12-12-2017"},
{name: "Something", date: "12-12-2019"},
{name: "Something", date: "12-5-2018"},
{name: "Something", date: "12-2-2018"},
{name: "Something", date: "SOMETHING_INVALID"},
{name: "Something", date: "12-12-2016"},
]
您可以使用过滤器这样过滤有效日期和将来的日期,
let dates = [
{name: "Something", date: "1-12-2018"},
{name: "Something", date: "2-12-2017"},
{name: "Something", date: "3-12-2019"},
{name: "Something", date: "4-5-2018"},
{name: "Something", date: "5-2-2018"},
{name: "Something", date: "InvalidSomething"},
{name: "Something", date: "7-12-2016"},
]
let filteredDates = dates.filter((item) => {
let date = new Date(item.date);
if(date !== 'Invalid Date' && Date.now() < date.getTime()){
return item;
}
});
console.log(filteredDates);
很少澄清:
Date.now()
和date.getTime()
都用于获取timestamp,并且我正在JavaScript过滤器内部进行比较,如果date对象未返回"Invalid Date"
字符串,并且**时间戳记的数字大于今天的时间戳,则它是将来的日期。
当这两个条件匹配时,filter
将返回由object
变量收集的整个filteredDates
。循环完成后,您将获得阵列以供进一步使用。干杯!