2014-04-01 97 views
0

我從Google日曆Feed中獲取字符串數據。日期已經通過參數設置了所需的時區。如何在不更改文化的情況下格式化日期字符串?

2014-05-24T07:00:00.000-04:00 

我知道有像moment.js和date.js這將有助於格式化我的約會精彩庫,但他們也有一個Date對象,它拋出我的日期爲客戶的企業文化工作。那時我正在雜耍偏移。寧願避免這一點。

除了很多條件字符串操作外,有沒有簡單的方法來做到這一點,或者我簡化了(再次)?

例子:

2014-05-24T07:00:00.000-04:0024 2014年5月, - 7:00 AM

+0

我會使用正則表達式。我認爲這相當優雅 – acbabis

+0

因此,你所要做的就是將2014-05-24的日期部分重新格式化爲2014年5月24日,而忽略了時間? – RobG

+0

不,我的錯誤,我不想忽視時間。 – mmcglynn

回答

2

下面的短代碼將解析您的日期,使用目前的值,而不受時區偏移:

var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
     'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; 
var res = /(\d+)\-(\d+)\-(\d+)T(\d+)\:(\d+)/ 
     .exec('2014-05-24T07:00:00.000-04:00'); 
var am = (res[4] < 12); 
var date = months[res[2]-1] + ', ' + res[3] + ', ' + res[1]; 
var time = am ? (parseInt(res[4]) + ':' + res[5] + 'AM') : 
     (res[4] - 12 + ':' + res[5] + 'PM'); 
var formatted = date + ' - ' + time; 
console.log(formatted); 
+0

+1,但不需要parseInt,數組索引只是Object屬性,所以名稱是字符串。你可以使用'var res = string.match(/ \ d +/g)'來獲取部分並使用位1,2和0.: – RobG

+0

@RobG你是正確的,索引是屬性,但是當使用作爲屬性名稱的字符串,它仍然必須完全匹配。試試這個:'[1,2,3,4] ['01']'。它不起作用 – acbabis

+0

返回的月份是六月,不是五月。 – mmcglynn

1

您可以將這個字符串轉換成日期對象像下面,

new Date("2014-05-24T07:00:00.000-04:00") 

然後你就可以很容易地轉換這個日期對象成你想要的格式通過使用任何jQuery的庫,例如jquery.globalize.js ...

+0

儘管ES5,由Date構造函數解析日期字符串依然在很大程度上依賴於實現。將字符串拆分爲多個部分並手動解析它會更好。另外,將其轉換爲日期對象並不是OP想要執行的操作,因爲日期應該保留並且不受不同時區的影響。 – RobG

+0

這是正確的RobG。 – mmcglynn

1

在這裏你去:

var d = new Date('2014-05-24T07:00:00.000-04:00'); 

var calendar = { 
    months: { 
     full: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], 
     short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
    }, 
    days: { 
     full: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 
     short: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] 
    } 
}; 

console.log(calendar.months.short[d.getMonth()]+', '+d.getDate()+', '+d.getFullYear()); 
0

一個簡單的功能重新格式化字符串是:

function reformatDateString(s) { 
    s = s.match(/\d+/g); 
    var months = ['January','February','March','April','May','June','July', 
       'August','September','October','November','December']; 
    var ampm = s[3]<12? 'AM':'PM'; 
    return months[--s[1]] + ', ' + +s[2] + ', ' + s[0] + ' - ' + 
       (s[3]%12 || 12) + ':' + s[4] + ' ' + ampm; 
} 

console.log(reformatDateString('2014-05-24T07:00:00.000-04:00')); // May, 24, 2014 - 7:00 AM 
console.log(reformatDateString('2014-05-24T17:00:00.000-04:00')); // May, 24, 2014 - 5:00 PM 
console.log(reformatDateString('2014-05-04T00:20:00.000-04:00')); // May, 4, 2014 - 12:20 AM 

還假設你不想要前導零除了會議記錄以外的單位數字,因爲像12:5 PM這樣的時間對我來說不如12:05 PM可讀。

此外,您可能需要修改月份數組,OP中不清楚您是否需要完整的月份名稱或縮寫(1月,2月等)。