视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
关于JavaScript的Date最详细解读
2020-11-27 20:24:24 责编:小采
文档

UTC(世界标准时间)

协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文「Coordinated Universal Time」/法文「Temps Universel Cordonné」而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时

CST(北京时间)

北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。

不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:

  • Central Standard Time (USA) UT-6:00

  • Central Standard Time (Australia) UT+9:30

  • China Standard Time UT+8:00

  • Cuba Standard Time UT-4:00

  • 插一个中国地区 JS 客户端时间和服务端时间不一致的问题

    总结就是,前后端去传时间的时候,尽量都用 UTC 时间。

    ISO 日期和时间的表示方法

    if ( !Date.prototype.toISOString ) {
     ( function() {
    
     function pad(number) {
     if ( number < 10 ) {
     return '0' + number;
     }
     return number;
     }
    
     Date.prototype.toISOString = function() {
     return this.getUTCFullYear() +
     '-' + pad( this.getUTCMonth() + 1 ) +
     '-' + pad( this.getUTCDate() ) +
     'T' + pad( this.getUTCHours() ) +
     ':' + pad( this.getUTCMinutes() ) +
     ':' + pad( this.getUTCSeconds() ) +
     '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
     'Z';
     };
    
     }() );
    }

    通过 Polyfill 我们就能知道 ISO 是怎么表示时间的,最主要的特征是最后一位是“Z”,然后表示的总是 UTC 时间。

    额外的补充

    .valueOf() 和 .getTime()

    .valueOf()的功能和.getTime()一样。

    该方法通常在 JavaScript 内部被调用,而不是在代码中显式调用。什么意思?没有 valueOf,那么Date的实例是不能进行运算的。

    var obj = Object.create(null);
    obj + 1; // Uncaught TypeError: Cannot convert object to primitive value(…)

    .toJSON

    直接看这个 API 的名字的时候,我以为会返回一个 JSON 格式的字符串,但其实是这么一个东西

    new Date().toJSON() // "2016-05-05T06:03:28.130Z"

    其实是这么回事

    JSON.stringify(new Date()) // ""2016-05-05T06:06:02.615Z""

    那结果能够被 parse 吗?

    JSON.parse(JSON.stringify(new Date())) // "2016-05-05T06:19:24.766Z"
    JSON.parse('"' + new Date().toJSON() + '"') // "2016-05-05T06:19:24.766Z"

    但是结果只是字符串而已。需要再讲这个字符串交给 new Date() 才行。

    .toLocaleFormat()

    不属于任何标准。在JavaScript 1.6中被实现。似乎也只有 Firefox 自持这个 API,其实正确姿势是用.toLocaleDateString()

    .toLocale各种String()

    .toLcale各种String(locales [, options]])

    妈的这个 API 有点烦,看 MDN 的文档你就知道。这个 API 是用来本地化时间的。

    这里稍微说下我对这些参数的理解:

    locales

    var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
    
    // formats below assume the local time zone of the locale;
    // America/Los_Angeles for the US
    
    // US English uses month-day-year order
    alert(date.toLocaleString("en-US"));
    // → "12/19/2012, 7:00:00 PM"
    
    // British English uses day-month-year order
    alert(date.toLocaleString("en-GB"));
    // → "20/12/2012 03:00:00"
    
    // Korean uses year-month-day order
    alert(date.toLocaleString("ko-KR"));
    // → "2012. 12. 20. ?? 12:00:00"
    
    // Arabic in most Arabic speaking countries uses real Arabic digits
    alert(date.toLocaleString("ar-EG"));
    // → "???/???/???? ?:??:?? ?"
    
    // for Japanese, applications may want to use the Japanese calendar,
    // where 2012 was the year 24 of the Heisei era
    alert(date.toLocaleString("ja-JP-u-ca-japanese"));
    // → "24/12/20 12:00:00"
    
    // when requesting a language that may not be supported, such as
    // Balinese, include a fallback language, in this case Indonesian
    alert(date.toLocaleString(["ban", "id"]));
    // → "20/12/2012 11.00.00"

    locales所指的地区的时区和语言输出。

    options

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

  • localeMatcher 选择本地匹配的什么算法,似乎没什么大用

  • timeZone 再设置下 UTC 时区

  • hour12 是否12小时制

  • formatMatcher 各日期时间单元的格式化

  • weekday Possible values are "narrow", "short", "long".

  • era Possible values are "narrow", "short", "long".

  • year Possible values are "numeric", "2-digit".

  • month Possible values are "numeric", "2-digit", "narrow", "short", "long".

  • day Possible values are "numeric", "2-digit".

  • hour Possible values are "numeric", "2-digit".

  • minute Possible values are "numeric", "2-digit".

  • second Possible values are "numeric", "2-digit".

  • timeZoneName Possible values are "short", "long".

  • 栗子:

    var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
    
    date.toLocaleString("en-US", {hour12: false}); // "12/19/2012, 19:00:00"
    
    var options = {timeZoneName:'long',weekday: "long", year: "2-digit", month: "narrow", day: "numeric"};
    date.toLocaleString("en-US", options); // "Thursday, D 20, 12, China Standard Time"

    插一个JavaScript 显示 Y-m-d H:i:s 的日期时间格式

    老实的方法

    let date = new Date();
    let result = [
     [
     date.getFullYear(),
     date.getMonth() + 1,
     date.getDate()
     ].join('-'),
     [
     date.getHours(),
     date.getMinutes(),
     date.getSeconds()
     ].join(':')
    ].join(' ').replace(/\b\d\b/g, '0$&');

    diao 一点的方法

    var date = new Date();
    var result = date.toLocaleString('zh-CN', { hour12: false })
     .replace(/\//g, '-').replace(/\b\d\b/g, '0$&');

    一些有用的时间库

  • https://github.com/moment/moment

  • https://github.com/rmm5t/jquery-timeago

  • 下载本文
    显示全文
    专题