格式化 JavaScript 日期

在现代浏览器中格式化 JavaScript 日期

在现代浏览器(*)中, Date.prototype.toLocaleDateString() 允许你以方便的方式定义 Date 的格式。

它需要以下格式:

dateObj.toLocaleDateString([locales [, options]])

locales 参数应该是带有 BCP 47 语言标记的字符串,或者是此类字符串的数组。

options 参数应该是具有以下部分或全部属性的对象:

  • localeMatcher :可能的值是 lookupbest fit; 默认为 best fit
  • timeZone :实现必须识别的唯一值是 UTC; 默认值是运行时的默认时区
  • hour12 :可能的值是 truefalse; 默认值取决于语言环境
  • formatMatcher :可能的值是 basicbest fit; 默认为 best fit
  • 工作日 :可能的值是 narrowshortlong
  • 时代 :可能的值是 narrowshortlong
  • :可能的价值是 numeric2-digit
  • :可能的值是 numeric2-digitnarrowshortlong
  • :可能的值是 numeric2-digit
  • 小时 :可能的值是 numeric2-digit
  • 分钟 :可能的值是 numeric2-digit
  • 第二 :可能的值是 numeric2-digit
  • timeZoneName :可能的值是 shortlong

如何使用

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

输出如果在 2036 年 1 月 24 日执行:

'24 Jan 2036'

去定制

如果 Date.prototype.toLocaleDateString() 不够灵活,无法满足你的任何需求,你可能需要考虑创建一个如下所示的自定义 Date 对象:

var DateObject = (function() {
    var monthNames = [
      "January", "February", "March",
      "April", "May", "June", "July",
      "August", "September", "October",
      "November", "December"
    ];
    var date = function(str) {
        this.set(str);
    };
    date.prototype = {
        set : function(str) {
            var dateDef = str ? new Date(str) : new Date();
            this.day = dateDef.getDate();
            this.dayPadded = (this.day < 10) ? ("0" + this.day) : "" + this.day;
            this.month = dateDef.getMonth() + 1;
            this.monthPadded = (this.month < 10) ? ("0" + this.month) : "" + this.month;
            this.monthName = monthNames[this.month - 1];
            this.year = dateDef.getFullYear();
        },
        get : function(properties, separator) {
            var separator = separator ? separator : '-'
                ret = [];
            for(var i in properties) {
                ret.push(this[properties[i]]);
            }
            return ret.join(separator);
        }
    };
    return date;
})();

如果你在 2019 年 1 月 20 日包含该代码并执行了 new DateObject(),它将生成具有以下属性的对象:

day: 20
dayPadded: "20"
month: 1
monthPadded: "01"
monthName: "January"
year: 2019

要获取格式化字符串,你可以执行以下操作:

new DateObject().get(['dayPadded', 'monthPadded', 'year']);

这将产生以下输出:

20-01-2016

(*) 根据 MDN现代浏览器意味着 Chrome 24 +,Firefox 29 +,IE11,Edge12 +,Opera 15+和 Safari 夜间构建