2016-12-12 6 views
1

14200704000002015-01-01 00:00:00、最大日付は1575158400000で、最小の日付は2019-12-01 00:00:00とすることができます。タイムスタンプで日付の配列を1年増分で作成する

私は、このようなものを2つの日付の間の各月のタイムスタンプの配列を作成しよう:

var offset = 5*60*60000 

dtMin = new Date(+1420070400000 + offset); 
dtMax = new Date(+1575158400000 + offset); 

console.log("dtmin: ", dtMin); 
console.log("dtmax: ", dtMax); 

while (dtMin <= dtMax) { 

    dtRng.push((dtMin.getTime() - offset).toString()); 

    dtMin = new Date(new Date(dtMin).setMonth(dtMin.getMonth()+1)); 

} 

console.log("dt rng:", JSON.stringify(dtRng)); 

それは、配列としてこれを返します。

["1420070400000","1422748800000","1425168000000","1427842800000","1430434800000","1433113200000","1435705200000","1438383600000","1441062000000","1443654000000","1446332400000","1448928000000","1451606400000","1454284800000","1456790400000","1459465200000","1462057200000","1464735600000","1467327600000","1470006000000","1472684400000","1475276400000","1477954800000","1480550400000","1483228800000","1485907200000","1488326400000","1491001200000","1493593200000","1496271600000","1498863600000","1501542000000","1504220400000","1506812400000","1509490800000","1512086400000","1514764800000","1517443200000","1519862400000","1522537200000","1525129200000","1527807600000","1530399600000","1533078000000","1535756400000","1538348400000","1541026800000","1543622400000","1546300800000","1548979200000","1551398400000","1554073200000","1556665200000","1559343600000","1561935600000","1564614000000","1567292400000","1569884400000","1572562800000","1575158400000"] 

しかし、時にはそれが戻って引っ張ります31日または30日目のように:

Epoch date Human readable date (GMT) 
1420070400 2015-01-01 00:00:00 
1422748800 2015-02-01 00:00:00 
1425168000 2015-03-01 00:00:00 
1427842800 2015-03-31 23:00:00 
1430434800 2015-04-30 23:00:00 
1433113200 2015-05-31 23:00:00 
1435705200 2015-06-30 23:00:00 
1438383600 2015-07-31 23:00:00 

なぜ私はincrです月ごとに褒め言葉?

また、私のminDateとmaxDateは異なる場合があります。インスタントの場合、minDateは1464739200000(水曜日、2016年6月1日00:00:00)、最大日付は1488326400000(Wed、01 Mar 2017 00:00) :00)...

また、なぜそれが正確に最初の3ヶ月ではなくその後のもののためにそれをするのか、その後...行動はただ奇妙なようだ...

--- EDIT-- ---

このためmomentjsを使用しようとこれにwhile一部を変更:

奇妙な
while (dtMin <= dtMax) { 

     dtRng.push(dtMin); 

     dtMin = moment(dtMin).add(1, 'months').toDate(); 
     console.log("dtmin: ", dtMin); 
    } 

何かがここで起こる...コンソール版画この:

Sun Feb 01 2015 00:00:00 GMT-0500 (EST) 
Sun Mar 01 2015 00:00:00 GMT-0500 (EST) 
Wed Apr 01 2015 00:00:00 GMT-0400 (EDT) 
Fri May 01 2015 00:00:00 GMT-0400 (EDT) 
Mon Jun 01 2015 00:00:00 GMT-0400 (EDT) 
Wed Jul 01 2015 00:00:00 GMT-0400 (EDT) 
Sat Aug 01 2015 00:00:00 GMT-0400 (EDT) 
Tue Sep 01 2015 00:00:00 GMT-0400 (EDT) 

が、このようなdtRng見にプッシュされますタイムスタンプは、30に気づく、と31日と23hrs:

Epoch date Human readable date (GMT) 
1422748800 2015-02-01 00:00:00 
1425168000 2015-03-01 00:00:00 
1427842800 2015-03-31 23:00:00 
1430434800 2015-04-30 23:00:00 
1433113200 2015-05-31 23:00:00 
1435705200 2015-06-30 23:00:00 
1438383600 2015-07-31 23:00:00 
1441062000 2015-08-31 23:00:00 
1443654000 2015-09-30 23:00:00 

それは、これを返す必要があります:最新のアップデートから

Epoch date Human readable date (GMT) 
1422748800 2015-02-01 00:00:00 
1425168000 2015-03-01 00:00:00 
1427846400 2015-04-01 00:00:00 
1430438400 2015-05-01 00:00:00 
1433116800 2015-06-01 00:00:00 
1435708800 2015-07-01 00:00:00 
1438387200 2015-08-01 00:00:00 
1441065600 2015-09-01 00:00:00 
+0

タイムゾーンは常にタイムゾーンです。 [Moment.js](http://momentjs.com)のようなライブラリを使って日付を操作することをお勧めします。 [この質問](http://stackoverflow.com/q/3674539/215552)も参照してください。 –

+0

@MikeMcCaughan、ちょうどmomentjsでそれを試したが、それでもそれを得るように見えることができない...まだ奇妙な行動を得て... – user2061886

+0

どのようにそれらの "人間可読の日付"を取得していますか? 'toISOString()'や 'JSON.stringify()'を使っていることを確認してください。それ以外の場合は、UTCではなく現地時間が表示されている可能性があります。 –

答えて

0

、それは0123のように思えます東部標準時(EST)から東部夏時間(EDT)に移行する際に時間を失う(または!?)ことがあります。これは、一部の日付で23:00:00を印刷する理由を説明しています。

dealing with timezonesa bit trickyことができますが、この特定の問題のために、私は単純なアプローチを使用することをお勧めし、Date.UTC機能を使用してUTCですべての日付を作成します。単純なループは、すべての年のすべての月を反復処理するために、次のようになります。

for(var year = 2015; year < 2020; year++) 
    for(var month = 0; month < 12; month++) 
     dtRng.push(new Date(Date.UTC(year, month, 1, 00, 00, 00))); 

出力console.log(JSON.stringify(dtRng))は、正しい結果が得られているようだ:

"2015-02-01T00:00:00.000Z", 
"2015-03-01T00:00:00.000Z", 
"2015-04-01T00:00:00.000Z", 
"2015-05-01T00:00:00.000Z", 
"2015-06-01T00:00:00.000Z", 
.... 

変更は、開始と終了をループになります3部の日付:

  • 最初の1年間は、開始月から12時までループします。
  • 最後の年を除くすべての年について、そのような年ごとに1〜12ヶ月間ループします。
  • 昨年は、1から最後の月にループします。

次のコードは、YYYY/MM/DD形式で日付範囲(2015/03/01 to 2019/09/01)のためにこれを示しています。

// Initialize the date range. 
var startYear = 2015, startMonth = 03, 
     endYear = 2019, endMonth = 09; 

// Loop through the years. 
for(var year = startYear; year <= endYear; year++) { 
    var currStartMonth = 1, currEndMonth = 12; 

    // If it's the first year, skip the months before the range. 
    if (year === startYear) currStartMonth = startMonth; 

    // If it's the last year, skip the months after the range. 
    // Note that this also gracefully handles the case when, 
    // startYear === endYear. 
    if (year === endYear)  currEndMonth = endMonth; 

    // Loop through the months and add it to the dates array. 
    // '- 1' because of 0-indexing of month. 
    for (var month = currStartMonth - 1; month < currEndMonth; month++) 
     dtRng.push(new Date(Date.UTC(year, month, 1, 00, 00, 00))); 
} 
+0

私の最小タイムスタンプと最大タイムスタンプが異なる場合(時には同じ年になることもありますが)、常にその月の第1日に表示されます...どうすればその年を修正せずに行うことができますか? – user2061886

+0

これは、同じ年を扱い、および/または別の月から始めるために簡単に変更することができます。 'Date.UTC'の最後の3つの引数を使用して、時、分、秒を追加することができます。 –

+0

どのようにループしますか?たとえば、私の最小の日付が1464739200000(水曜日、2016年6月1日00:00:00)で、私の最大日付が1488326400000(水曜日、2013年3月1日00:00:00)であれば、その2人の間? – user2061886

関連する問題