如何格式化 JavaScript 日期

IT技术 javascript date date-formatting
2020-12-10 21:49:43

在 JavaScript 中,如何格式化要打印的日期对象10-Aug-2010

6个回答

如果您需要对格式的控制比当前接受的答案稍少,Date#toLocaleDateString可用于创建标准的特定于语言环境的渲染。localeoptions论据让应用程序指定其格式约定应该使用的语言,并允许渲染的一些定制。

选项关键示例:

  1. day:一天
    的表示。
    可能的值为“数字”、“2 位数字”。
  2. 工作日:工作日
    的表示。
    可能的值为“窄”、“短”、“长”。
  3. 年份:年份
    的表示。
    可能的值为“数字”、“2 位数字”。
  4. 月份:月份
    的表示。
    可能的值为“数字”、“2 位”、“窄”、“短”、“长”。
  5. 小时:小时
    的表示。
    可能的值为“数字”、“2 位数字”。
  6. 分钟:分钟 的表示。
    可能的值为“数字”、“2 位数字”。
  7. 第二个:第二个
    的表示。
    可能的值为“数字”,2 位数字。

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

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

对于不同的语言:

  1. “en-US”:英语
  2. “hi-IN”:对于印地语
  3. “ja-JP”:日语

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

例如

var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
var today  = new Date();

console.log(today.toLocaleDateString("en-US")); // 9/17/2016
console.log(today.toLocaleDateString("en-US", options)); // Saturday, September 17, 2016
console.log(today.toLocaleDateString("hi-IN", options)); // शनिवार, 17 सितंबर 2016

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

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

参考:

似乎这个答案应该是最好的“当前”答案。还使用选项“hour12: true”来使用 12 小时与 24 小时格式。也许应该在答案中添加到您的摘要列表中。
2021-02-07 21:49:43
@KVij——这是格式化日期的一种非常低效的方式,特别是考虑到有一个formatToParts方法返回对象数组中的所有部分。
2021-02-14 21:49:43
表示它是非标准的,但mozzilla没有具体说明
2021-02-23 21:49:43
对以下链接进行了长时间的挖掘,但我找到了它们的隐藏位置@MosesSchwartz:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-03 21:49:43
@Iarwa1n 这个答案没有提到,但您可以使用 toLocaleDateString 仅返回某些部分,然后您可以根据需要加入这些部分。在下面检查我的答案。date.toLocaleDateString("en-US", { day: 'numeric' }) + "-"+ date.toLocaleDateString("en-US", { month: 'short' }) + "-" + date.toLocaleDateString("en-US", { year: 'numeric' })应该给16-Nov-2019
2021-03-05 21:49:43

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

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

{ // example 1
   let f = new Intl.DateTimeFormat('en');
   let a = f.formatToParts();
   console.log(a);
}
{ // example 2
   let f = new Intl.DateTimeFormat('hi');
   let a = f.formatToParts();
   console.log(a);
}

更好的是将格式数组映射到结果字符串:

function join(t, a, s) {
   function format(m) {
      let f = new Intl.DateTimeFormat('en', m);
      return f.format(t);
   }
   return a.map(format).join(s);
}

let a = [{day: 'numeric'}, {month: 'short'}, {year: 'numeric'}];
let s = join(new Date, a, '-');
console.log(s);

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

let d = new Date(2010, 7, 5);
let ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d);
let 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.jsluxon),因为该领域有许多隐藏的复杂性。

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

2021 年,momentjs 文档说我们不鼓励在未来的新项目中使用 Moment
2021-02-11 21:49:43
我知道那ye是年,mo是月,da是日。什么是o什么是a什么是m你能用正确的变量名吗?
2021-02-21 21:49:43
或者扩展Date对象,就像我在stackoverflow.com/questions/3187790/...
2021-03-06 21:49:43

如果你需要使用普通的JavaScript,使用快速格式化你的日期getDategetMonth + 1getFullYeargetHoursgetMinutes

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')
2021-02-12 21:49:43
@BennyJobgan 应该提到的是,String.padStart()它仅在 ECMAScript 2017 中可用。
2021-02-13 21:49:43

使用date.format 库

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 

npm 上的日期格式

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

如果您在导入外部依赖时遇到麻烦,我建议您使用 moment.js。它可以执行这种类型的日期格式化:momentjs.com/docs/#/displaying并且它具有更多功能。
2021-02-06 21:49:43
IE 中的日期 API相比,时区也适用于日期格式
2021-02-09 21:49:43
他的“L”代码是错误的,他应该删除“L> 99?” 部分...除此之外,它非常整洁,如果不是很好本地化。
2021-02-25 21:49:43
此解决方案也可用作 npm 包:npmjs.com/package/dateformat
2021-03-03 21:49:43

好吧,我想要的是将今天的日期转换为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();

function toLocal(date) {
  var local = new Date(date);
  local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
  return local.toJSON();
}

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

// check out your devtools console
console.log(date.toJSON());
console.log(date.toISOString());
console.log(toLocal(date));

console.log(toJSONLocal(date));

您可以new Date(date + " UTC")欺骗时区,并且可以消除 setMinutes 行。伙计,javascript 很脏
2021-02-09 21:49:43
new Date().toISOString().slice(0, 16).replace('T',' ') 包括时间
2021-02-17 21:49:43
Y10K 兼容版本:var today = new Date().toISOString().slice(0,-14):)
2021-02-19 21:49:43
只是评论缺乏时区并不是“一天开始/结束时”的一些小不便。例如,在澳大利亚,日期可能会错误到上午 11 点左右——将近半天!
2021-03-02 21:49:43
或者像这样 new Date().toISOString().split('T')[0]
2021-03-04 21:49:43