如何在 JavaScript 中格式化日期?

问:

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

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

答1:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

如果您需要比当前接受的答案稍微少一点的格式控制,Date#toLocaleDateString 可用于创建标准区域设置特定的呈现。 locale 和 options 参数让应用程序指定应使用其格式约定的语言,并允许对呈现进行一些自定义。

选项关键示例:

日:一天的表示。可能的值为“数字”、“2 位”。 weekday:表示工作日。可能的值是“窄”、“短”、“长”。年份:年份的表示。可能的值为“数字”、“2 位”。月:月份的表示。可能的值是“numeric”、“2-digit”、“narrow”、“short”、“long”。小时:小时的表示。可能的值为“数字”、“2 位”。分钟:分钟的表示。可能的值为“数字”、“2 位”。 second:第二个的表示。可能的值为“数字”、2 位数字。

所有这些键都是可选的。您可以根据您的要求更改选项值的数量,这也将反映每个日期时间项的存在。

注意:如果您只想配置内容选项,但仍使用当前语言环境,则为第一个参数传递 null 将导致错误。请改用 undefined。

对于不同的语言:

“en-US”:美式英语 “en-GB”:英式英语 “hi-IN”:印地语 “ja-JP”:日语

您可以使用更多语言选项。

例如

var options = { weekday: ‘long’, year: ‘numeric’, month: ‘long’, day: ‘numeric’ }; var 今天 = 新日期(); console.log(today.toLocaleDateString(“en-US”)); // 9/17/2016 console.log(today.toLocaleDateString(“en-US”, options)); // 2016 年 9 月 17 日星期六 console.log(today.toLocaleDateString(“hi-IN”, options)); // शनिवार, 17 सितंबर 2016

您也可以将 toLocaleString() 方法用于相同目的。唯一的区别是这个函数提供了你不传递任何选项的时间。

// Example
9/17/2016, 1:21:34 PM

参考:

toLocaleString()

toLocaleDateString()

this 说它是非标准的,但 mozzilla 没有具体说明

似乎这个答案应该是最好的“当前”答案。还使用选项“hour12: true”来使用 12 小时制与 24 小时制格式。也许应该在答案中添加到您的摘要列表中。

@Iarwa1n 此答案未提及,但您可以使用 toLocaleDateString 仅返回某些部分,然后您可以根据需要加入这些部分。在下面检查我的答案。 date.toLocaleDateString("en-US", { day: 'numeric' }) + "-"+ date.toLocaleDateString("en-US", { month: 'short' }) + "-" + date.toLocaleDateString("en-US", { year: 'numeric' }) 应该给 16-Nov-2019

对以下链接进行了长时间的挖掘,但我发现了它们的隐藏位置@MosesSchwartz:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

@KVij - 这是格式化日期的一种非常低效的方法,特别是考虑到有一个 formatToParts method 返回对象数组中的所有部分。

答2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

对于自定义分隔的日期格式,您必须从 DateTimeFormat 对象(它是 ECMAScript Internationalization API 的一部分)中提取日期(或时间)组件,然后手动创建带有所需分隔符的字符串。

为此,您可以使用 DateTimeFormat#formatToParts。您可以解构数组,但这并不理想,因为数组输出取决于语言环境:

{ // 示例 1 let f = new Intl.DateTimeFormat(‘en’);让 a = f.formatToParts();控制台.log(a); } { // 示例 2 let f = new Intl.DateTimeFormat(‘hi’);让 a = f.formatToParts();控制台.log(a); }

最好将格式数组映射到结果字符串:

函数加入(t,a,s){函数格式(m){让f=新Intl.DateTimeFormat(‘en’,m);返回 f.format(t); } return a.map(format).join(s); } let a = [{day: ‘numeric’}, {month: ‘short’}, {year: ‘numeric’}];让 s = join(new Date, a, ‘-’);控制台.log(s);

您也可以使用 DateTimeFormat#format 将 DateTimeFormat 的各个部分一一拉出,但请注意,在使用此方法时,截至 2020 年 3 月,ECMAScript 实现中有 a bug 涉及前导零在分钟和秒(这个错误被上面的方法规避)。

让 d = new Date(2010, 7, 5);让 ye = new Intl.DateTimeFormat(‘en’, { year: ‘numeric’ }).format(d);让 mo = new Intl.DateTimeFormat(‘en’, { month: ‘short’ }).format(d); let da = new Intl.DateTimeFormat(‘en’, { day: ‘2-digit’ }).format(d); console.log(${da}-${mo}-${ye});

在处理日期和时间时,通常值得使用库(例如 moment.js、luxon),因为该字段有许多隐藏的复杂性。

请注意,上述解决方案中使用的 ECMAScript 国际化 API 不受支持in IE10(2020 年 2 月的0.03%全球浏览器市场份额)。

或者扩展 Date 对象,就像我在 stackoverflow.com/questions/3187790/… 中所做的那样

我知道 ye 是年,mo 是月,da 是日。 o 是什么? a 是什么? m 是什么?你能使用正确的变量名吗?

在 2021 年,momentjs 文档说我们希望阻止 Moment 被用于未来的新项目

这是最好的答案恕我直言(最后一个片段),因为允许任何格式的灵活性,即您不需要寻找满足您需求的国家代码

答3:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

如果您需要使用纯 JavaScript 快速格式化您的日期,请使用 getDate、getMonth + 1、getFullYear、getHours 和 getMinutes:

var d = new Date();

var datestring = d.getDate()  + "-" + (d.getMonth()+1) + "-" + d.getFullYear() + " " +
d.getHours() + ":" + d.getMinutes();

// 16-5-2015 9:50

或者,如果您需要用零填充它:

var datestring = ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" +
    d.getFullYear() + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2);

// 16-05-2015 09:50

您还可以使用 .toString().padStart(2, '0') 填充零

@BennyJobigan 应该提到的是,String.padStart() 仅适用于 ECMAScript 2017。

答4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

使用 date.format library:

var dateFormat = require('dateformat');
var now = new Date();
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");

返回:

Saturday, June 9th, 2007, 5:46:21 PM 

dateformat on npm

http://jsfiddle.net/phZr7/1/

他的“L”代码是错误的,他应该删除“L > 99?”部分...除此之外,它非常整洁,如果不是太好本地化的话。

此解决方案也可作为 npm 包提供:npmjs.com/package/dateformat

如果您要麻烦导入外部依赖项,我建议您使用 moment.js。它可以进行这种类型的日期格式化:momentjs.com/docs/#/displaying 而且它有更多的功能。

与 IE 中的 Date API 相比,时区也适用于日期格式

答5:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

好吧,我想要将今天的日期转换为 MySQL 友好的日期字符串,如 2012-06-23,并在我的一个查询中使用该字符串作为参数。我发现的简单解决方案是这样的:

var today = new Date().toISOString().slice(0, 10);

请记住,上述解决方案并未考虑您的时区偏移。

您可以考虑改用这个函数:

function toJSONLocal (date) {
    var local = new Date(date);
    local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return local.toJSON().slice(0, 10);
}

如果您在一天的开始/结束时执行此代码,这将为您提供正确的日期。

var date = new Date();函数 toLocal(date) { var local = new Date(date); local.setMinutes(date.getMinutes() - date.getTimezoneOffset());返回 local.toJSON(); } function toJSONLocal(date) { var local = new Date(date); local.setMinutes(date.getMinutes() - date.getTimezoneOffset());返回 local.toJSON().slice(0, 10); } // 检查你的开发工具控制台 console.log(date.toJSON()); console.log(date.toISOString()); console.log(toLocal(date)); console.log(toJSONLocal(date));

Date.toISOString

日期.toJSON

字符串切片

外部示例

您可以执行 new Date(date + " UTC") 来欺骗时区,并且可以消除 setMinutes 行。伙计,javascript很脏

Y10K 兼容版本:var today = new Date().toISOString().slice(0,-14) :)

或者像这样new Date().toISOString().split('T')[0]

new Date().toISOString().slice(0, 16).replace('T',' ') 包括时间

只是评论说缺少时区并不是“一天开始/结束时”的一些小不便。例如,在澳大利亚,直到上午 11 点左右,日期可能是错误的——将近半天!

答6:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

自定义格式化功能:

对于固定格式,一个简单的功能就可以完成。以下示例生成国际格式 YYYY-MM-DD:

函数 dateToYMD(date) { var d = date.getDate(); var m = date.getMonth() + 1; //月份从 0 到 11 var y = date.getFullYear();返回 ‘’ + y + ‘-’ + (m<=9 ? ‘0’ + m : m) + ‘-’ + (d <= 9 ? ‘0’ + d : d); } console.log(dateToYMD(new Date(2017,10,5))); // 11 月 5 日

OP 格式可以生成如下:

function dateToYMD(date) { var strArray=[‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’, ‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘十一月’,‘十二月’]; var d = date.getDate(); var m = strArray[date.getMonth()]; var y = date.getFullYear();返回 ‘’ + (d <= 9 ? ‘0’ + d : d) + ‘-’ + m + ‘-’ + y; } console.log(dateToYMD(new Date(2017,10,5))); // 11 月 5 日

注意:然而,扩展 JavaScript 标准库通常不是一个好主意(例如,通过将此函数添加到 Date 的原型中)。

更高级的功能可以基于格式参数生成可配置的输出。

如果编写格式化函数太长,有很多库可以完成它。其他一些答案已经列举了它们。但增加的依赖性也有它的对应部分。

标准 ECMAScript 格式化函数:

由于 ECMAScript 的更新版本,Date 类具有一些特定的格式化函数:

toDateString:依赖于实现,只显示日期。 https://262.ecma-international.org/#sec-date.prototype.todatestring new Date().toDateString(); // 例如“2016 年 11 月 11 日星期五”

toISOString:显示 ISO 8601 日期和时间。 https://262.ecma-international.org/#sec-date.prototype.toisostring new Date().toISOString(); // 例如“2016-11-21T08:00:00.000Z”

toJSON:JSON 的字符串化符。 https://262.ecma-international.org/#sec-date.prototype.tojson new Date().toJSON(); // 例如“2016-11-21T08:00:00.000Z”

toLocaleDateString:依赖于实现,区域设置格式的日期。 https://262.ecma-international.org/#sec-date.prototype.tolocaledatestring new Date().toLocaleDateString(); // 例如“21/11/2016”

toLocaleString:依赖于实现,区域设置格式的日期和时间。 https://262.ecma-international.org/#sec-date.prototype.tolocalestring new Date().toLocaleString(); // 例如“21/11/2016, 08:00:00 AM”

toLocaleTimeString:依赖于实现,采用区域设置格式的时间。 https://262.ecma-international.org/#sec-date.prototype.tolocaletimestring new Date().toLocaleTimeString(); // 例如“08:00:00 AM”

toString:日期的通用 toString。 https://262.ecma-international.org/#sec-date.prototype.tostring new Date().toString(); // 例如“2016 年 11 月 21 日星期五 08:00:00 GMT+0100(西欧标准时间)”

注意:可以从这些格式中生成自定义输出 >

新的 Date().toISOString().slice(0,10); //返回 YYYY-MM-DD

示例片段:

console.log("1) "+ 新日期().toDateString()); console.log("2) "+ new Date().toISOString()); console.log("3) "+ 新日期().toJSON()); console.log("4) "+ new Date().toLocaleDateString()); console.log("5) "+ new Date().toLocaleString()); console.log("6) "+ new Date().toLocaleTimeString()); console.log("7) "+ 新日期().toString()); console.log("8) "+ new Date().toISOString().slice(0,10));

指定标准函数的语言环境:

上面列出的一些标准函数取决于语言环境:

toLocaleDateString()

toLocaleTimeString()

toLocalString()

这是因为不同的文化使用不同的格式,并以不同的方式表达他们的日期或时间。默认情况下,该函数将返回在其运行的设备上配置的格式,但这可以通过设置参数 (ECMA-402) 来指定。

toLocaleDateString([locales[, options]])
toLocaleTimeString([locales[, options]])
toLocaleString([locales[, options]])
//e.g. toLocaleDateString('ko-KR');

option 第二个参数,允许在所选语言环境中配置更具体的格式。例如,月份可以显示为全文或缩写。

toLocaleString('en-GB', { month: 'short' })
toLocaleString('en-GB', { month: 'long' })

示例片段:

console.log("1) "+ new Date().toLocaleString(‘en-US’)); console.log("2) "+ new Date().toLocaleString(‘ko-KR’)); console.log("3) "+ new Date().toLocaleString(‘de-CH’)); console.log("4) "+ new Date().toLocaleString(‘en-GB’, { hour12: false })); console.log("5) "+ new Date().toLocaleString(‘en-GB’, { hour12: true }));

关于语言环境的一些良好做法:

大多数人不喜欢他们的日期以外国人格式出现,因此,尽可能保留默认语言环境(在任何地方设置“en-US”)。

实现从/到 UTC 的转换可能具有挑战性(考虑 DST、时区不是 1 小时的倍数等)。尽可能使用经过良好测试的库。

不要假设区域设置与一个国家/地区相关:几个国家/地区有很多(加拿大、印度等)

避免通过非标准方式检测语言环境。在这里您可以了解多个陷阱:检测键盘布局、通过地理位置检测语言环境等。

我认为英国示例的语言环境应该是“en-GB”以获得“dd/mm/yyyy”格式

我解决了这个问题。谢谢

很好地列出了 Intl.DateTimeFormat() constructor 支持的参数如下:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

感谢您从不使用“ECMA vodoo”的示例开始

.toJSON() 在底层使用 .toIsoString()(根据 docs)。 需要注意 ISO 转换会转换为另一个时区,这可能会更改日期部分(请参阅其他评论)。此外,似乎OP想要转换为Oracle(等)“语言环境/文化”,而不是人类......

答7:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

如果你已经在你的项目中使用 jQuery UI,你可以这样做:

var formatted = $.datepicker.formatDate("M d, yy", new Date("2014-07-08T09:02:21.377"));

// formatted will be 'Jul 8, 2014'

一些日期选择器日期格式选项可用here。

答8:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

我认为您可以只使用 非标准 Date 方法toLocaleFormat(formatString)

formatString: 格式字符串与 C 中的 strftime() 函数所期望的格式相同。

var today = new Date();
today.toLocaleFormat('%d-%b-%Y'); // 30-Dec-2011

参考:

本地化格式

时间

编辑添加:toLocaleFormat 现在已被弃用,如上面的链接所示。

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

toLocaleFormat() 似乎只适用于 Firefox。 IE 和 Chrome 对我来说都失败了。

Chrome 有 .toLocaleString('en') 方法。似乎新浏览器支持此 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

在此处阅读警告:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

new Intl.DateTimeFormat 似乎是替换 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

年后,此功能在其他浏览器中仍然无法使用,并且在 Firefox 中已被弃用Deprecated_toLocaleFormat

答9:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

纯 JavaScript 是小型一次性用户的最佳选择。

另一方面,如果您需要更多日期信息,MomentJS 是一个很好的解决方案。

例如:

moment().format('YYYY-MM-DD HH:m:s');     // now() -> 2015-03-24 14:32:20
moment("20111031", "YYYYMMDD").fromNow(); // 3 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 11 hours ago
moment().endOf('day').fromNow();          // in 13 hours

重要的是:除非您知道 YYYY 和 yyyy 之间的区别,否则不要使用 YYYY:stackoverflow.com/questions/15133549/…

@Domin 特定于 iOS 中的 NSDateFormatter,例如在 Objective-C 或 Swift 中使用。这个问题是关于浏览器中的 Javascript,这个答案使用 MomentJS,其中 YYYY(不是 yyyy)是标准年份,GGGG(不是 YYYY)是基于 ISO 周的年份。

答10:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

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

今天执行的输出(2016 年 1 月 24 日):

'24-Jan-2016'

(*) According to MDN,“现代浏览器”指 Chrome 24+、Firefox 29+、Internet Explorer 11、Edge 12+、Opera 15+ & Safari nightly build。

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

一行中的请求格式 - 没有库也没有 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.prototype.toString() 的输出依赖于实现,因此对于国际或非浏览器实现,只需测试输出以确保它在您的 JavaScript 引擎中正常工作。您甚至可以添加一些代码来测试字符串输出,并在进行正则表达式替换之前确保它与您期望的匹配。

原文链接:https://www.huntsbot.com/qa/laQE/how-do-i-format-a-date-in-javascript?lang=zh_CN&from=csdn

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值