2012-10-24 73 views
3

我一直在使用堆棧溢出了幾個月,但這是我的第一篇文章。JavaScript:將日/週轉換爲年

我需要一個函數來將星期數和星期幾轉換爲dd/mm/yyyy格式。

我必須使用的日期值格式爲day/weekNumber。因此,例如:3/43將轉換爲20XX年10月24日星期三。年度價值將是當年。

日期值從1(星期一)開始。

我在網上找到了很多功能(如this,thisthis)。有些人使用ISO 8601日期,我認爲這不適合我。而我還沒有找到一個適合我的人。

由於提前,

回答

1

此解決方案確實需要添加額外的庫,但我認爲它確實值得。它是一個momentjs庫,用於處理日期和時間。它積極維護,並有一個偉大的documentation。一旦你的一天,weekNumber(在我們的例子3和43)的值,你應該做到如下:

function formatInput(day, weekNumber){ 

    var currentDate = moment(new Date());  // initialize moment to a current date 
    currentDate.startOf('year');    // set to Jan 1 12:00:00.000 pm this year 
    currentDate.add('w',weekNumber - 1);  // add number of weeks to the beginning of the year (-1 because we are now at the 1st week) 
    currentDate.day(day);      // set the day to the specified day, Monday being 1, Sunday 7 

    alert(currentDate.format("dddd, MMMM Do YYYY")); // return the formatted date string 
    return currentDate.format("dddd, MMMM Do YYYY"); 
} 

我覺得這個庫可能對你有用以後,有很多關於日期的可能性和時間操作,以及格式化選項。還有一個偉大的文件寫爲momentjs。

+0

使用「12:00:00.000」是混淆和模棱兩可的,因爲對於12點意味着午夜還是午間(嚴格意義上都不是)沒有共識。今年年初爲2012-01-01 00:00:00,但這不是使用ISO週日期的第一週的第一天,發生在2012年1月2日星期一。 – RobG

2

因此,假如你有343值分別,你可以做在本年度的第一天一些簡單的數學:

  • 獲取1月1日當前年
  • 添加(43 * 7 + 3)

事情是這樣的,也許:

var currentDate = new Date(); 
var startOfYear = new Date(currentDate.getFullYear(), 0, 1);//note: months start at 0 
var daysToAdd = (43 * 7) + 3; 
//add days 
startOfYear.setDate(startOfYear.getDate() + daysToAdd); 

Here is an example


編輯

關於第二個想法,我想我是錯了你的要求。看起來你需要一週中的某一天。 Check this out以獲得更好的解決方案。

問題是,這一切都取決於你一個星期的定義。今年是星期天開始,那麼這意味着02/01/2012(今年的第一個星期一)是第二週的開始?與週日期打交道時

我最近的一個例子將首先找到指定的一週的開始,然後找到指定的天

1

的下一次出現。根據ISO的周從星期一開始,並在第一週今年是包含今年第一個星期四的那一年。因此,2012年第一週從1月2日星期一開始,2013年第一週將於2012年12月31日星期一開始。

所以如果3/43是第43周的第三天(這是ISO日期2012-W43-3),那麼它可以被它轉化成使用日期對象:

function customWeekDateToDate(s) { 
    var d, n; 
    var bits = s.split('/'); 

    // Calculate Monday of first week of year this year 
    d = new Date(); 
    d = new Date(d.getFullYear(),0,1); // 1 jan this year 
    n = d.getDay(); 
    d.setDate(d.getDate() + (-1 * n +(n<5? 1 : 8))); 

    // Add days 
    d.setDate(d.getDate() + --bits[0] + --bits[1] * 7); 

    return d; 
} 

console.log(customWeekDateToDate('3/43')); // 01 2012-10-24 

注意,這裏使用的日期,否則夏令換可能會導致錯誤的日期。