2012-07-26 64 views
1

我有一個字符串,其格式爲allways:2012年5月7日或2012年5月17日 我的目標是解析此字符串並以此格式獲取日期:yyyy-mm-dd用javascript格式解析正確的格式字符串

所以,我的例子7 2012年5月將成爲2012-05-07 17 2012年5月將成爲2012-05-17

我已經tryed與

Date.parse("7 May 2012", "yyyy-mm-dd") 

但結果是:

Sun May 20 2012 00:00:00 GMT+0200 (CEST) 

非常感謝您的幫助。

+1

'Date.parse'只帶一個參數。 – 2012-07-26 14:24:47

回答

2

我不知道你在哪裏得到Date.parse調用,JavaScript的Date.parse沒有第二個參數。

要做到這一點,你需要自己解析字符串,或使用MomentJS或類似的東西來爲你做。如果你想自己解析它,你可能需要一個正則表達式和一個查找表(用於月份名稱)。正則表達式將沿着這些路線:

var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str); 

...在那裏你會最終parts[0]是,parts[1]月份名稱,並parts[2]一年的日子。然後,只需轉換當月大寫或小寫,並使用查找表來月份名稱映射到月份數,東西沿着這些線路:

var months = { 
    "jan": 0, 
    "january": 0, 
    "feb": 1, 
    "february": 1, 
    "may": 4, 
    // ... 
    "dec": 11, 
    "december": 11 
}; 
var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str); 
var dt; 
if (parts) { 
    parts[2] = months[parts[2].toLowerCase()]; 
    if (typeof parts[2] !== "undefined") { 
     dt = new Date(parseInt(parts[3], 10), 
         parts[2], 
         parseInt(parts[1], 10)); 
    } 
} 

Live example | source

然後,您可以格式化生成的Date對象。 (再次,有庫在那裏幫助。)

或者,當然,從來沒有實際製作Date,只是直接從parts格式。

+0

嗨,謝謝你的回答,但解析總是沒有定義給我。 – 2012-07-26 14:38:36

+1

@Ana:對不起,我忘記了索引0是*整體*字符串匹配(「2012年5月7日」),緊接着是捕獲組。所以所有的指數都是一個。固定。 – 2012-07-26 14:46:31

+0

謝謝T.J.克勞德,我會試試看。 – 2012-07-26 14:47:41

2

這不是Date.parse的工作方式,它只需要一個參數,它會返回一個unix時間戳。

如果您想要一個Date對象,請使用new Date

var myDate = new Date("7 May 2012"); 
// Mon May 07 2012 00:00:00 

然後你可以自己分析它成你想要的格式:

var year = myDate.getFullYear(), 
    month = myDate.getMonth() + 1, // month returns 0-11, not 1-12 
    day = myDate.getDate(); 
var dateStr = year + '-' + (month < 10 ? 0 : '') + month + '-' + (day < 10 ? 0 : '') + day; 

注意"7 May 2012"是非標準的日期格式,可能無法在所有瀏覽器正常工作。

注2:要100%確定它可以在所有瀏覽器中工作,我會使用類似Datejs的庫。

// Using Date.js 
var myDate = Date.parse('7 May 2012'); 
var dateStr = myDate.toString('yyyy-MM-dd'); 
+1

'var myDate = new Date(「2012年5月7日」);'使用不支持的,未指定的格式,這可能無法可靠地跨瀏覽器工作。 [規範](http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15)中唯一的格式僅適用於ES5,並且根本不使用月份名稱(對於明顯的語言環境的原因)。我期望上述失敗,比如法語本地化的瀏覽器(儘管我沒有一個方便)。無論如何,你都會依賴無證行爲。 – 2012-07-26 14:32:26

+0

@ T.J.Crowder:Mozilla說''新Date'(和'Date.parse')也支持RFC 2822日期。 – 2012-07-26 14:36:08

+0

@火箭:Mozilla沒有定義這個標準(已經不再)。 ECMA確實。如果他們想要在規範中包含RFC 2822,他們會這麼做。 – 2012-07-26 14:36:44