某日,同事问到关于new Date() 函数传参数,在火狐浏览器和谷歌浏览器控制台运行,会得到不同的结果,刚开始觉得不可能,后来实际操作才发现此陷阱

var date = new Date('2014-07-25T23:00:00');
alert(date);

在火狐浏览器返回的是:

Date {Fri Jul 25 2014 23:00:00 GMT+0800}

火狐浏览器版本(通过navigator.userAgent输出):"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"

在谷歌浏览器返回的是:

Sat Jul 26 2014 07:00:00 GMT+0800 (中国标准时间)

谷歌浏览器版本(通过navigator.userAgent输出):"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"

两个时间对比,谷歌浏览器把传进的字符串当做是UTC时间,加上了8个小时(北京处于东八区),new Date()内部调用的是Date.parse('2014-07-25T23:00:00Z')函数

而火狐浏览器当做是本地时区没有自动加上,在火狐浏览器中传递UTC格式字符串最后加上Z(Z表示zulu time,就是格林威治时间)。

当然也可以在UTC字符串末尾加入一个零时区的offset“+00:00”,如‘2014-07-25T23:00:00+00:00’。

火狐浏览器运行结果如下:

new Date('2014-07-25T23:00:00');
Date {Fri Jul 25 2014 23:00:00 GMT+0800}
new Date('2014-07-25T23:00:00Z');
Date {Sat Jul 26 2014 07:00:00 GMT+0800}
new Date('2014-07-25T23:00:00+00:00');
Date {Sat Jul 26 2014 07:00:00 GMT+0800}

谷歌浏览器运行结果如下:

new Date('2014-07-25T23:00:00');
Sat Jul 26 2014 07:00:00 GMT+0800 (中国标准时间)
new Date('2014-07-25T23:00:00Z');
Sat Jul 26 2014 07:00:00 GMT+0800 (中国标准时间)
new Date('2014-07-25T23:00:00+00:00');
Sat Jul 26 2014 07:00:00 GMT+0800 (中国标准时间)

因为不知道浏览器加不加区时,所以建议是自己写一个函数实现将字符串转化为时间格式:

//将字符串转换为时间格式,适用各种浏览器,格式如2011-08-03 09:15:11
function GetTimeByTimeStr(dateString) {
var timeArr=dateStr.split(" ");
var d=timeArr[0].split("-");
var t=timeArr[1].split(":");
 new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]);
}

//将时间转换为字符串格式,适用各种浏览器
function GetTimeStrByTime(time,stringType) {
   var y = time.getFullYear();
    var M = time.getMonth() + 1;
    var d = time.getDate();
    var h = time.getHours();
    var m = date.getMinutes();
   if(stringType==1)
    return  y + '-' + (M < 10 ? ('0' + M) : M) + '-' + (d < 10 ? ('0' + d) : d) + " " + (h < 10 ? ('0' + h) : h) + ":" + (m < 10 ? ('0' + m) : m);
   return  y + '/' + (M < 10 ? ('0' + M) : M) + '/' + (d < 10 ? ('0' + d) : d) + " " + (h < 10 ? ('0' + h) : h) + ":" + (m < 10 ? ('0' + m) : m);
}

另外,可以对常见的JSON格式数据进行扩展转换

//将json格式时间字符串规范化为正规字符串或者时间,如"\/Date(1406217600000)\/" function GetTimeStrByJsonStr(JsonStr) {
    var date = new Date(parseInt(sonStr.replace("/Date(", "").replace(")/", ""), 10));
    return GetTimeStrByTime(date,2);
}
//时间参数为“7月25日13时”
function getDateTimeStr(startDate,dateString) {
    var currenthour = dateString.split('日')[1];
    if (currenthour.indexOf("时") != -1)
        currenthour = currenthour.split('时')[0];
    if (currenthour == 0)
        currenthour = 24;
    var tempdate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());
    tempdate.setTime(tempdate.getTime() + currenthour * 3600000);
    return GetTimeStrByTime(tempdate, 2);
}

Chrome和Firefox浏览器执行new Date() 函数传参数得到不同结果的陷阱的更多相关文章

  1. 关于main函数传参数的问题

    argc是命令行总的参数个数      argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数      命令行后面跟的用户输入的参数,比如:      int   main(int   ...

  2. Chrome和Firefox浏览器调试对比

    最近的项目中使用Extjs5, 其中主要的一个特点就是js文件的动态加载,之前使用Firefox浏览器对js文件进行调试,打断点时,只对当次调试有效,刷新之后,由于动态加载的js文件(文件名后面加了一 ...

  3. 利用闭包向post回调函数传参数

    最近在闲逛XX站的时候,打算搞个破坏,试试有多少人还是用初始密码登陆.比较懒,所以直接打开控制台来写. 所以问题可以描述为: 向后端不断的post数据,id从1~5000自增,后端会根据情况来返回值r ...

  4. 前端开发chrome与fireFox浏览器都使用

    chrome查看元素的样式时,显示的很方便和准确,方便开发快速辨别结构. 而fireFox在css3上,我发现好像比chrome支持得更全面.

  5. PHP Date()函数详细参数

    在页面的最前页加上 date_default_timezone_set(PRC); /*把时间调到北京时间,php5默认为格林威治标准时间*/ date () a: "am"或是& ...

  6. python学习:函数传参数

    #!/usr/bin/python   import sys   def isNum(s):     for i in s:         if i in '0123456789':         ...

  7. 关于IE,Chrome,Firefox浏览器的字符串拼接问题

    昨天项目测试的时候,IE8.IE11测试勾选checkbox然后执行保存的时候,竟然执行的结果与预期相反,吓屎我了,最终排查之下,原来是拼接checkbox的值的时候出现的问题.本人对js了解知之甚少 ...

  8. Selenium2学习-005-WebUI自动化实战实例-003-三种浏览器(Chrome、Firefox、IE)启动脚本源代码

    此文主要通过 三种浏览器(Chrome.Firefox.IE)启动脚本 功能,进行 Selenium2 三种浏览器启动方法的实战实例讲解.文中所附源代码于 2015-01-18 20:33 亲测通过, ...

  9. Python+Selenium 环境配置之Firefox,IE,Chrome几种浏览器运行

    Selenium(Webdriver)支持Firefox,IE,Chrome等多个浏览器.很多人可能装环境时遇到很多问题,下面简单聊聊如何配置测试这几个浏览器以及相关通过简单的实例来测试. 1.Fir ...

随机推荐

  1. AVFoundation播放视频时显示字幕,切换音轨

    主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWit ...

  2. Android 缓存

    1.Android缓存机制&一个缓存框架推荐 http://blog.csdn.net/shakespeare001/article/details/51695358 2.ASimpleCac ...

  3. POJ1961[KMP 失配函数]

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 16776   Accepted: 8077 Descripti ...

  4. 另一种在WINFORM中使用XNA的方法

    之前在写化学分子模型制作程序的时候,使用一种方法,将WINFORM控件嵌入到XNA窗体中,从而实现了即使用WINFORM窗体控件又使用XNA.最近在写另一个物理运动学课件制作程序,同样使用XNA,但从 ...

  5. echart饼状图使用,打发时间。

    新公司,刚来几天,闲着没事,领导让我做些无关痛痒的活,优化报表统计!!!之前是用flash做的,现在要改成echart实现.好吧,之前没用过,抱着学习态度,研究了下.写点东西打发下时间,能帮到需要帮助 ...

  6. JQuery Object vs. DOM element

    JQuery Object 和 DOM的区别 HTML DOM 定义了访问和操作HTML文档的标准方法.其中 document 是DOM 树的根对象 ,在浏览器宿主环境中,可以通过JS操作HTML D ...

  7. API Design

    REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1       简介 本文档旨在规范REST API的 ...

  8. JavaScript正则表达式(二)

    定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  9. reactor模式学习

    一.介绍reactor模式 二.使用reactor模式 三.参考 http://blog.csdn.net/swordmanwk/article/details/6170995  该文章,简单介绍了r ...

  10. python中scipy.misc.logsumexp函数的运用场景

    scipy.misc.logsumexp函数的输入参数有(a, axis=None, b=None, keepdims=False, return_sign=False),具体配置可参见这里,返回的值 ...