2014-02-14 63 views

回答

0

我不能删除这个,因为OP选择它作为答案(OP请选择Xotic750的)答案。

See Xotic750's answer

+0

你还需要填补这个月份和日子:) – Archer

+0

@Archer是留给读者的一个练习:) –

+0

如果你有足够的幸运有一个能正确解析字符串的环境。 – Xotic750

2

可以打破串入的部分,则位格式化成你所需要的:

// Reformat string like: Fri Feb 21 2014 00:00:00 GMT-0800 (Pacific Standard Time) 
// do yyyy-mm-dd 
function reformatDateString(s) { 
    function z(n){return (n<10?'0':'') + n;} 
    var months = {jan:'01', feb:'02', mar:'03', apr:'04', may:'05', jun:'06', 
        jul:'07', aug:'08', sep:'09', oct:'10', nov:'11', dec:'12'}; 
    s = s.split(/[ :]/g); 
    return s[3] + '-' + months[s[1].toLowerCase()] + '-' + z(s[2]); 
} 

您可以使用日期的构造,但在这里是没有必要的。使用构造函数解析字符串是有问题的,因为OP中的字符串不适合ES5中指定的格式(所有使用的浏览器都不支持此格式),而解析则与实现相关。

所以要使用Date需要解析零件,导致许多额外的函数调用。

1

日期Fri Feb 21 2014 00:00:00 GMT-0800采用标准RFC 2822格式,因此您可以使用new Date()作为参数创建新日期。这会将其转换为UTC(自1970年1月1日以来的毫秒),您可以操作它。

然后可以转换UTC为ISO 8601扩展格式(2014-02-21T00:00:00.000Z)与toISOString()方法,并得到了T之前的文本:

var utcDate = new Date('Fri Feb 21 2014 00:00:00 GMT-0800'); 
var isoExtendedDate = utcDate.toISOString(); 
var isoSimpleDate = isoExtendedDate.split("T")[0]; 
+1

ES5不需要实现来支持除ISO 8601版本以外的任何格式。其他格式的解析依赖于实现 – RobG

2

使用标准的字符串/数组操作

var timeStamp = 'Fri Feb 21 2014 00:00:00 GMT-0800 (Pacific Standard Time)', 
    months = { 
     Jan: 1, 
     Feb: 2, 
     Mar: 3, 
     Apr: 4, 
     May: 5, 
     Jun: 6, 
     Jul: 7, 
     Aug: 8, 
     Sep: 9, 
     Oct: 10, 
     Nov: 11, 
     Dec: 12 
    }, 
    parts = timeStamp.split(' ', 4).slice(1), 
    myStamp; 

function pad(val) { 
    if (val < 10) { 
     val = '0' + val; 
    } 

    return val; 
} 

parts[0] = months[parts[0]]; 
parts.unshift(parts.pop()); 
parts[1] = pad(parts[1]); 
parts[2] = pad(parts[2]); 
mystamp = parts.join('-'); 
console.log(mystamp); 

输出

2014-02-21 

jsFiddle

+0

卷积并且有点冗长,但它完成了工作。 :-) – RobG

+0

@RobG它是'-vv'模式。谢谢。 ;) – Xotic750

相关问题