使用日期循环(查询)我的localStorage.JavaScript中日期对象的困难时期

Using dates to cycle through (query) my localStorage. Difficult times with the date object in JavaScript

本文关键字:日期 对象 JavaScript localStorage 循环 查询 我的      更新时间:2023-09-26

我使用localStorage来存储基于日期的数据。我认为(我认为!)它相当优雅。

数据像这样输入:

localStorage.setItem(datakey, JSON.stringify(dataObject));  

我把它弄出来,像这样

dataObject = JSON.parse(localStorage.getItem(datakey)); 
如您所见,datakey是主键。我用了一个格式化的日期。数据是DD/MM/YY格式,我得到它(感谢StackOverflow)像这样:
Date.prototype.getDateKey = function() {
    function two(n) {
        return (n < 10 ? '0' : '') + n;
    }
    return two(this.getDate()) + '/' + two(this.getMonth() + 1) + '/' + this.getFullYear();
};
var d       = new Date();
var datakey = d.getDateKey();

所以现在我想做的是使用另一个变量来"搜索"localStorage并提取两个日期(今天和过去的一个点)之间的所有数据。我试过了:

 function getData(timespan){
    var period  = timespan;
var start_date  = d.setMonth(d.getMonth()-timespan);
var today_key   = d.getDateKey();
var history_key = start_date.getDateKey();
 }

to no avail

我想循环通过日期,一天一天,但start_date不是一个日期对象,由于某种原因,因此没有getDateKey()方法。我计划使用for循环从history_key循环到today_key,每次获取localStorage数据,这样:

dataObject = JSON.parse(localStorage.getItem(i));

,然后将结果粘贴到可以从中提取数据的数组中。

主要问题:如何通过日期循环并使它们进入i,所以我从localStorage获得数据。start_date不是一个对象(根据console和typeof),所以我有点卡住了。

很抱歉解释这么长,但如果我明确我要做什么,可能会更容易让人们看到这一切的意义,也许会告诉我,我做x或y很疯狂,或者像这样使用localStorage。

有谁对如何处理这个问题有什么想法吗?

Date.setMonth()不返回Date对象。实际上,它什么也不返回。你认为日期就像字符串一样,是不可变的。日期是可变的,所以…:

function getStartDate(timespan) {
    var date = new Date();
    date.setMonth(date.getMonth()-timespan);
    return date;
}
var today = (new Date()).valueOf(); //milliseconds
function getNextDate(currentDate) {
    //get the next day:
   currentDate.setDate(currentDate.getDate()+1);
   var finish = currentDate.valueOf() > today;
   return finish ? null : currentDate;
}

var currentDate = getStartDate(1); //let's say, one month ago.
var dataObjects = [];
do {
    var storedItem = JSON.parse(localStorage.getItem(currentDate.getDateKey()));
    if (storedItem) dataObjects.push(storedItem);
} while (currentDate = getNextDate(currentDate));

就是这个意思。希望它对你有用。

编辑

基本上,我设置了一个currentDate,一个由今天定义的日期和你通过getStartDate()的时间跨度。然后存储代表今天的毫秒数。这样,getNextDate()函数将检查增加的日期是否大于今天。如果是,则进程停止。

没有理由让getNextDate()返回currentDate。它是一个全局变量,此外,函数已经修改了它的值,而不是引用本身。我这样做是出于审美目的。我必须返回一些东西,并且,作为函数被称为getNextDate(),它返回下一个日期是合乎逻辑的……除非那个日期比今天大,在这种情况下我返回null。当我返回null时,表达式

curentDate = getNextDate(currentDate)

等于null(赋值是一个返回l值接收到的值的表达式,这就是为什么像a = b = c = 10;这样的表达式有效),并且do ... while循环结束。

顺便说一下,您发现的错误是因为我忘记将当前日期传递给getNextDate()。现在应该可以工作了。

试一下,如果发现错误,告诉我。