如何将Date对象格式化为字符串?


当前回答

包装解决方案:Luxon或date fns

如果你想使用一个解决方案来适应所有人,我建议使用date fns或Luxon。

Luxon托管在Moment.js网站上,由Moment.jss开发人员开发,因为Momentjs具有开发人员想解决但无法解决的局限性。

要安装:

npm安装luxon或纱线添加luxon(其他安装方法请访问链接)

例子:

luxon.DateTime.fromISO('2010-08-10').toFormat('yyyy-LL-dd');

产量:

2010年8月10日

手动解决方案

使用与Moment.js、ClassDateTimeFormatter(Java)和ClassSimpleDateFormat(Java)类似的格式,我实现了一个全面的解决方案formatDate(date,patternStr),代码易于阅读和修改。您可以显示日期、时间、AM/PM等。有关更多示例,请参阅代码。

例子:

formatDate(new Date(),'EEEE,MMMM d,yyyy HH:mm:ss:S')

(formatDate在下面的代码段中实现)

产量:

2018年10月12日星期五18:11:23:445

单击“运行代码段”尝试代码

日期和时间模式

yy=2位年份;yyyy=全年

M=数字月;MM=2位月;MMM=短月份名称;MMMM=完整月份名称

EEEE=工作日全名;EEE=短工作日名称

d=数字日;dd=2位数字日

h=小时上午/下午;hh=上午/下午两位数小时;H=小时;HH=2位数小时

m=分钟;mm=2位数分钟;aaa=上午/下午

s=秒;ss=2位数秒

S=毫秒

var month名称=[“一月”,“二月”,“三月”,“四月”,“五月”,“六月”,“七月”,“八月”、“九月”、“十月”、“十一月”、“十二月”];var dayOfWeekNames=[“星期日”、“星期一”、“周二”,“周三”、“周四”、“周五”、“周六”];函数formatDate(日期,patternStr){if(!patternStr){patternStr='M/d/yyyy';}var day=date.getDate(),month=date.getMonth(),year=date.getFullYear(),hour=date.getHours(),minute=date.getMinutes(),second=date.getSeconds(),毫秒=date.getMilliseconds(),h=小时%12,hh=两位数广告(h),HH=两位数(小时),mm=两个DigitPad(分钟),ss=twoDigitPad(秒),aaa=小时<12?'上午:下午,EEEE=dayOfWeekNames[date.getDay()],EEE=EEEE.substr(0,3),dd=twoDigitPad(天),M=月+1,MM=两个DigitPad(M),MMMM=monthNames[月],MMM=MMMM.substr(0,3),yyyy=年+“”,yy=yyyy.substr(2,2);//检查是否将使用月份名称patternStr=patternStr.替换('h',hh).替换('h',h)替换('HH',HH)替换('H',小时).替换('m',mm).替换(m',分钟).替换('s',ss).替换(s'',second).replace('S',毫秒)替换('dd',dd)替换('d',day)替换('EEE',EEEE)替换('EE',EEE)替换('yyyy',yyyy).替换('yy',yy).替换('aaa',aaa);如果(patternStr.indexOf('MMM')>-1){patternStr=patternStr.替换('MMMM',MMMM).替换('MMM',MMM);}其他{patternStr=patternStr.替换('MM',MM).替换(M’,M);}返回模式Str;}函数twoDigitPad(num){返回num<10?“0”+num:num;}console.log(formatDate(newDate()));console.log(formatDate(new Date(),'dd MMM yyyy'))//OP的请求console.log(formatDate(new Date(),'EEEE,MMMM d,yyyy HH:mm:ss.S aaa'));console.log(formatDate(new Date(),'EEE,MMM d,yyyy HH:mm'));console.log(formatDate(new Date(),'yyyy-MM-dd HH:MM:ss.S'));console.log(formatDate(new Date(),'M/dd/yyyy h:mmaa'));

谢谢你@Gerry提起Luxon。

其他回答

一行中请求的格式-没有库和Date方法,只有正则表达式:

var d = (new Date()).toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/,'$2-$1-$3');
// date will be formatted as "14-Oct-2015" (pass any date object in place of 'new Date()')

在我的测试中,这在主要浏览器(Chrome、Safari、Firefox和IE)中可靠地工作。正如@RobG所指出的,Date.protype.toString()的输出依赖于实现,因此对于国际或非浏览器实现,只需测试输出,以确保它在JavaScript引擎中正常工作。您甚至可以添加一些代码来测试字符串输出,并在执行正则表达式替换之前确保其与预期匹配。

如果在代码中使用jQueryUI,则有一个内置函数,名为formatDate()。我用这种方式设置今天的日期:

var testdate = Date();
testdate = $.datepicker.formatDate( "d-M-yy",new Date(testdate));
alert(testdate);

在jQueryUI文档中可以看到许多其他格式化日期的示例。

设置日期格式的其他方式:

function formatDate(dDate,sMode){
    var today = dDate;
    var dd = today.getDate();
    var mm = today.getMonth()+1; //January is 0!
    var yyyy = today.getFullYear();
    if(dd<10) {
        dd = '0'+dd
    }
    if(mm<10) {
        mm = '0'+mm
    }
    if (sMode+""==""){
        sMode = "dd/mm/yyyy";
    }
    if (sMode == "yyyy-mm-dd"){
        return  yyyy + "-" + mm + "-" + dd + "";
    }
    if (sMode == "dd/mm/yyyy"){
        return  dd + "/" + mm + "/" + yyyy;
    }
}

在现代浏览器(*)中,您可以这样做:

var today = new Date().toLocaleDateString('en-GB', {
    day : 'numeric',
    month : 'short',
    year : 'numeric'
}).split(' ').join('-');

如果今天(1月24日)执行输出ᵗʰ, 2016):

'24-Jan-2016'

(*)根据MDN,“现代浏览器”是指Chrome 24+、Firefox 29+、Internet Explorer 11、Edge 12+、Opera 15+和Safari夜间版本。

有一个新的库smarti.to.js,用于JavaScript数字、日期和JSON日期的本地化格式(Microsoft或ISO8601)。

例子:

new Date('2015-1-1').to('dd.MM.yy')         // Outputs 01.01.2015
"2015-01-01T10:11:12.123Z".to('dd.MM.yy')   // Outputs 01.01.2015

本地化文件(smarti.to.{culture}.js)中也定义了自定义的短模式。示例(smarti.to.etEE.js):

new Date('2015-1-1').to('d')                // Outputs 1.01.2015

以及多样性能力:

smarti.format('{0:n2} + {1:n2} = {2:n2}', 1, 2, 3)   // Output: 1,00 + 2,00 = 3,00