详解JavaScript UTC时间转换方法


Posted in Javascript onJanuary 07, 2016

一、前言
1、UTC: Universal Time Coordinated,协调世界时。
2、格林尼治标准时(GMT)
    格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。 自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。而UTC是基于标准的GMT提供的准确时间。
    GMT(Greenwich Mean Time)——格林尼治标准时间,格林尼治标准时间是19 世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。当时主要为了1840 年之后的铁路系统服务。它以格林尼治天文台的经线为0 度经线,将世界分为24 个时区,除了在特定时期受到仇外心理、民族主义和某些反英心绪的影响之外,它的地位一直未曾动摇。

GMT和UTC的区别
    GMT 手表就是可以显示两个或两个以上时区时间的手表。无论用什么方式,显示多个时区最直接的方法就是在一个表壳里装多枚机芯。不过最经济也最常见的方法还是附加一个带有12 小时或24 小时时标刻度的旋转表圈。旋转表圈的使用方法很简单,将表圈上对应第二时区时间的数字对齐表盘的时针即可,如果表盘时间是伦敦时间,那么将表圈顺时针转动一小时,指示的就是欧洲大陆时间,逆时针转动八小时,则是美国西海岸时间。
    将表盘时间设定为家乡时间还是目的地时间取决于使用者的偏好,但由于12 小时手表无法辨别白天晚上,通常还是设定所在地时间比较合理。有一个事件的发生使得GMT 的定义复杂化了:1972 年1 月1日,UTC(协调世界时)成为新的世界标准时间。
    为了方便, 通常记成Universal Time Coordinated。同样为了方便,在不需要精确到秒的情况下,通常也将GMT 和UTC 视作等同。尽管UTC 更加科学更加精确,但是对于手表玩家和收藏者来说,GMT 仍是更加受欢迎的。有不少人认为,UTC 是巴黎图谋世界计时中心地位的一种手段。事实上,它是以原子时为基础,在时刻上尽量接近世界时的一种时间计量系统。它的出现是现代社会对于精确计时的需要。
    原子时与以往的计时系统不同,它非常精确并且不以某地的平均太阳时为基准,但是遇有地球自转速度不均匀,原子时与世界时之间的时差便日积月累,因 此,UTC 会在一段时期后加上正或负的闰秒来补偿。因此协调世界时与国际原子时(TAI) 之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局(IERS) 负责决定何时加入闰秒。

    北京时间与格林尼治时间或UTC时间相差8个时区,北京、上海、重庆位于东8区,所以北京时间2013-1-1 0:00:00,转换为UTC时间为:Tue Jan 1 00:00:00 UTC+0800 2013,时间过了8小时。
二、本地时间到UTC时间的转换
  当地时间到UTC时间的转换,步骤如下:

1、将字符串日期转换为日期数据类型
如果已经是日期类型,可以省去此步骤。

可利用下面示例中的函数进行转换。
2、获取UTC日期数据
包括年月日,时分秒,使用getUTC***()方法获取。

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

这里date为日期类型数据。

注意:这里使用没有UTC的方法是有问题(例如:date.getFullYear,date.getMonth),在进行下一步转换时,会出现结果错误。

3、使用Date.UTC()函数进行转换
将第2步中获取的日期数据转换为UTC时间(实际上为自1700年以来的毫秒数)

var utc = Date.UTC(y,m,d,h,M,s);

这里,y、m、d、h、M、s分别代表步骤2中获取的年、月、日、时、分、秒数值。

三、UTC日期到本地日期的转换
UTC日期到本地日期转换则要简单得多,先将UTC时间转换为日期格式,然后再转换为本地日期格式,例如:

var date2 = new Date(utc);

var localeString = date2.toLocaleString();

或只要日期

var localeDateString = date2.toLocaleDateString();

或只要时间

var localeTimeString = date2.toLocaleTimeString();

实例:

//日期加减计算 
function dateadd(sdate, delta, ymdh){ 
 if(!sdate ) return; 
  
 if(typeof sdate == 'object') sdate = sdate.toLocaleString(); 
 
 /(\d{4})[\D](\d{1,2})[\D](\d{1,2})[\D]?\s(\d{1,2}):(\d{1,2}):(\d{1,2})/.exec(sdate); 
 var a = [0,0,0,0]; 
  
 switch(ymdh){ 
  case 'y': 
   a = [delta, -1, 0, 0]; 
   break; 
  case 'm': 
   a=[0, delta-1, 0, 0]; 
   break; 
  case 'H': 
   a=[0, -1, 0, delta]; 
   break;  
  default: 
   a = [0, -1, delta, 0]; 
   break;   
 } 
  
 println('date:' + (parseInt(RegExp.$1)+ a[0]) + '-'+ (parseInt(RegExp.$2)+a[1]) +'-' + (parseInt(RegExp.$3)+a[2]) 
  + ' ' + (parseInt(RegExp.$4)+a[3]) +':' + RegExp.$5 + ':' +RegExp.$6); 
  
 return new Date(parseInt(RegExp.$1)+ a[0], parseInt(RegExp.$2)+a[1], parseInt(RegExp.$3)+a[2], parseInt(RegExp.$4)+a[3], RegExp.$5,RegExp.$6); 
} 
 
 //UTC转换 
 println('---------------------------------------------'); 
 var sdate='2013-01-01 00:00:00.0'; 
 var d = dateadd(sdate,0); 
 var d2 = Date.UTC(d.getUTCFullYear(),d.getUTCMonth() ,d.getUTCDate(),d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds()); 
 println('原日期:' + sdate); 
 println('d2:' + d2); 
 println('d3:' + new Date(d2)); 
 println('d4:' + new Date(d2).toLocaleString()); 
 println('d5:' + d2.toLocaleString());

测试结果:

---------------------------------------------
date:2013-0-1 0:00:00
原日期:2013-01-01 00:00:00.0
d2:1356969600000
d3:Tue Jan 1 00:00:00 UTC+0800 2013
d4:2013年1月1日 0:00:00
d5:1,356,969,600,000.00

可以看到UTC时间实际上是一串以自1970年以来的毫秒数表示的长数字。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
jquery 查找新建元素代码
Jul 06 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
javascript实现限制上传文件大小
Feb 06 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
Aug 13 Javascript
Javascript编程中几种继承方式比较分析
Nov 28 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
Dec 20 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
May 15 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 Javascript
Vue+Express实现登录状态权限验证的示例代码
May 05 Javascript
jQuery formValidator表单验证
Jan 07 #Javascript
JavaScript中的原始值和复杂值
Jan 07 #Javascript
理解JS事件循环
Jan 07 #Javascript
angularjs创建弹出框实现拖动效果
Aug 25 #Javascript
JavaScript中定义类的方式详解
Jan 07 #Javascript
javascript类型系统 Window对象学习笔记
Jan 07 #Javascript
直接拿来用的页面跳转进度条JS实现
Jan 06 #Javascript
You might like
php自定义错误处理用法实例
2015/03/20 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
xml转json的js代码
2012/08/28 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
js创建数组的简单方法
2016/07/27 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
英国著名书店:Foyles
2018/12/01 全球购物
业务副厂长岗位职责
2014/01/03 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
给朋友的道歉短信
2015/05/12 职场文书
电台广播稿范文
2015/08/19 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android