JavaScript的时区处理

几个概念

  1. UTC时间为标准时间, GMT时间比UTC时间有更多误差。
  2. 北京时间比UTC时间快8个小时。

数据库时间(Postgres)

数据库可以储存有时区的时间(timestamp with timezone)和无时区的时间(timestamp without timezone), 多数情况下使用后者。
createupdate给的时间参数有时区表示, 则数据库会依据定义的数据类型自动转化时区, 若没给出时区, 则默认视为标准时间。

  • 参数无时区, 数据库有时区
    • 参数: 2017-02-12 16:00:00
    • 存入后: 2017-02-12 16:00:00+00
  • 参数有时区, 数据库有时区
    • 参数: 2017-02-12 16:00:00+08
    • 存入后: 2017-02-12 16:00:00+08
  • 参数无时区, 数据库无时区
    • 参数: 2017-02-12 16:00:00
    • 存入后: 2017-02-12 16:00:00
  • 参数有时区, 数据库有时区
    • 参数: 2017-02-12 16:00:00+08
    • 存入后: 2017-02-13 00:00:00+00

JavaScript的基本转化方式

JavaScript的new Date()函数生成的是本地时间。

JavaScript Result
new Date Mon Feb 13 2017 00:00:00 GMT+0800 (CST)
toDateString Mon Feb 13 2017
toGMTString Sun, 12 Feb 2017 16:00:00 GMT
toISOString 2017-02-12T16:00:00.000Z
toJSON 2017-02-12T16:00:00.000Z
toLocaleDateString 2/13/2017
toLocaleTimeString 12:00:00 AM
toLocaleString 2/13/2017, 12:00:00 AM
toString Mon Feb 13 2017 00:00:00 GMT+0800 (CST)
toTimeString 00:00:00 GMT+0800 (CST)
toUTCString Sun, 12 Feb 2017 16:00:00 GMT

UTC时间转本地时间

var toLocal = function(date) {
  // 确保date 最终为Date object
  date = new Date(date);
  var local = date.toLocaleString('en-US', {
    hour12: false,
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  });
  return local;
};
  1. 通过toLocaleString()方法转化时区, 可以自定义显示样式。

本地时间转UTC时间

总体转化

var toUTC = function(date) {
  // 确保date 最终为Date object
  date = new Date(date);
  // 加入"+08"来标示对应的时区
  var utc = date.toISOString().replace(/Z/, "+00");
  return utc;
};

提取日期数据

  • 获取年 :var y = date.getUTCFullYear();
  • 获取月 :var m = date.getUTCMonth() ;
  • 获取日 :var d = date.getUTCDate();
  • 获取小时:var h = date.getUTCHours();
  • 获取分钟:var M = date.getUTCMinutes();
  • 获取秒钟:var s = date.getUTCSeconds();

推荐阅读更多精彩内容