2013-11-21 42 views
0

我有一個腳本,它從API中檢索週數和年數,並將它們轉換爲MomentJS日期對象。大多數這些條目都有正確的日期,只有最後一個對象出錯了,我看不出爲什麼。MomentJS日期對象錯誤

這是JSON結構:

{ 
    results: { 
     years: { 
      2013: { 
       weeks: [ 
        40, 41, 42, 43 
       ] 
      } 
     } 
    } 
} 

在Javascript中我做了以下循環:

for(var i in results.years[year].weeks) { 
    var week = parseInt(results.years[year].weeks[i]); 
    var startDate = '' + year + '-' + ((week.toString().length == 1) ? '' + '0' + week : week) + '-1'; 
    var eindDate = '' + year + '-' + ((week.toString().length == 1) ? '0' + week : week) + '-7'; 
    console.log(moment(startDate, 'GGGG-WW-E', true)); // returns the right date object 
    var startPeriode = moment(startDate, 'GGGG-WW-E'); 
    console.log(startPeriode); //If week = 43, this returns a date object with date (01 october 2013), rest is all good 
    var eindPeriode = moment(eindDate, 'GGGG-W-E', true); //Object is always correct 
} 

當週爲43的錯誤目前只發生(在最後weeknumber從中檢索API)和計算startDate時(eindDate目前是完美無瑕的)。當下對象還包含其他一些變量,這些看起來很完美,PE:

startDate._a = [ 
    '2013', 
    9, 
    21, 
    0, 
    0, 
    0, 
    0 
] 

我也試過如下:

  • moment('2013-W43-1');
  • moment('2013-43-1', 'GGGG-W-E');

和利用對象中的一些元素:

var startPeriode = moment('2013-W43-1'); 
var startDay = new Date(startPeriode._a[0] + '-' + startPeriode._a[1] + '-' + startPeriode._a[2]); 
var startPeriode = moment(startDay); 

我真的不知道如何解決這個問題,爲什麼這會出錯。任何一些想法?

+0

邊注:請不要使用'換in'循環數組索引,除非你真的知道它做什麼和保障循環正確;詳細信息[* for..in'的神話和現實*](http://blog.niftysnippets.org/2010/11/myths-and-realities-of-forin.html)(以及SO:[*對於數組中的每一個。如何在JavaScript中做到這一點?*](http://stackoverflow.com/questions/9329446/for-each-in-an-array-how-to-do-that-in-javascript/ 9329476#9329476))。 –

+0

@ T.J.Crowder謝謝!將實施您的提示! –

+1

你確定兩者之間沒有其他變化嗎?因爲用你的json結構和代碼,我得到了所有這些日期的正確日期。例如,第43周:開始日期'2013年10月21日星期一'和結束日期'2013年10月27日' –

回答

0

我無法複製您的第43週迴歸10月1日的報告。它總是在10月21日回來。我嘗試了最新的2.4.0版本的moment.js,還有舊版本,所以我不確定爲什麼會發生這種情況。

但是,您可能要進行一些更改:

  • 的唯一原因,從一個字符串是如果你是從一個字符串輸入開始你應該創建一個時刻。由於您是從數字輸入開始的,因此建立一個字符串只是爲了再次解析它是沒有意義的。

  • 你不應該太在意時刻的內部結構。 _a財產(和其他)不適用於直接消費。相反,請使用其中一種輸出方法,如format(和其他)。如果你想要一個JS Date,那麼只需使用.toDate()而不是試着從零件中組裝日期。

這裏是一個更清晰的代碼版本。我相信你可以爲你的目的調整它。

var weeks = results.years[year].weeks; 
for(var i=0; i < weeks.length; i++) { 

    var startPeriod = moment().year(year).isoWeek(weeks[i]).isoWeekday(1).startOf('day'); 
    var endPeriod = startPeriod.clone().isoWeekday(7).endOf('day'); 

    console.log(startPeriod.format("YYYY-MM-DD HH:mm:ss") + " - " + endPeriod.format("YYYY-MM-DD HH:mm:ss")) 
} 

輸出(在設置resultsyear變量)

2013-09-30 00:00:00 - 2013-10-06 23:59:59 
2013-10-07 00:00:00 - 2013-10-13 23:59:59 
2013-10-14 00:00:00 - 2013-10-20 23:59:59 
2013-10-21 00:00:00 - 2013-10-27 23:59:59