如何在 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提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!