IE中日期的日期子字符串和长度输出错误

时间:2017-11-24 15:14:02

标签: javascript date substring internet-explorer-11 substr

我正在尝试将js格式的日期转换为字符串,然后转换为json格式。

我从模型中获得的日期输入为"/Date(1511532984927)"

然后我正在转换它(变量后面的注释中的变量值):

var stringDate = dateString.replace(/\/Date[\(]/, "").replace(/[\)]/, "").replace(/[\/]/, ""); // "1511532984927"
var intDate = parseInt(stringDate); // 1511532984927
var dateDate = new Date(intDate); // Fri Nov 24 2017 14:16:24 GMT+0000 (GMT Standard Time)
var localDate = dateDate.toLocaleDateString(); // "‎24‎/‎11‎/‎2017"
var len = localDate.length; // 15

Chrome,Firefox和IE中的所有值都相同,只是在IE中长度为15而不是10。

因此,如果我试图将结果字符串(24/11 / 2017)转换回Date(),我会在IE中获得不正确的组件字符串(日,月,年),结果日期无效:

var day = dateString.substr(0, 2); // FF, Chrome: 24 - IE: 2
var month = dateString.substr(3, 2); // FF, Chrome: 11 - IE: /
var year = dateString.substr(6, 4); // FF, Chrome: 2017 - IE: 11/
new Date(month + ' ' + day + ' ' + year);

要获得正确的日期组件是IE,我需要像这样得到它们:

    var test = dateString.substring(1, 3);
    var test2 = dateString.substring(5,8);
    var test3 = dateString.substring(10);

为什么字符串“24/11/2017”可以在IE中提供15个字符的长度?

为什么以不同的方式计算每个角色的索引?

我在Apple bootcamp上的Windows 8.1上使用IE11

** 编辑 **

我认为我没有很好地解释我正在做的事情,因此引起了混乱。

我有一个字符串“24/11/2017”,需要将其转换为js Date()对象。

我没有必要从使用toLocalDateString()生成的字符串中执行此操作,这只是另一个示例。

谢谢,但到目前为止所有回复都与我需要做的事情无关。

2 个答案:

答案 0 :(得分:0)

现有的问题已经在浏览器中重新定义了区域设置转换的不同行为。链接是here

您正在将字符串转换为Date对象。为什么不能使用日期函数来获取月,日和年?

var stringDate = dateString.replace(/\/Date[\(]/, "").replace(/[\)]/, "").replace(/[\/]/, ""); // "1511532984927"
var intDate = parseInt(stringDate); // 1511532984927
var dateDate = new Date(intDate);
var month = dateDate.getMonth() // 10
var day = dateDate.getDate() // 24
var year = dateDate.getFullYear() // 2017
console.log(day, month, year);
// 24 10 2017

月基于零。更多信息here

再次创建一个新对象 `var myNewDate =新日期(年,月,日);

答案 1 :(得分:0)

  

所以,如果我试图将结果字符串(24/11 / 2017)转换回Date(),我的组件不正确

不要那样做。

toLocaleString 的输出完全取决于实现,因此在不同的主机和不同的系统上可能会有所不同。我在Safari,Chrome和IE中得到了不同的结果(与您的不同,因为我的系统设置不同)。

此外,不需要实现正确解析自己的输出(他们需要对Date.prototype.toString的输出执行此操作。)

  

为什么字符串“24/11/2017”可以在IE中提供15个字符的长度?

我认为你的意思是“我怎样才能使IE生成的格式与其他格式相同”。答案是不要使用 toLocaleString 并自己格式化(使用Date方法或库)。但是这两种方法都非常不可靠, toLocaleString 没有单一的格式,因此使用不同语言的不同地区的其他主机上的其他浏览器会产生不同的结果。

即使在一个浏览器中,您也绝对不能依赖它。 假设根据主机环境产生不同的结果。

  

为什么以不同的方式计算每个角色的索引?

不知道,但是您的基本问题是期望从到LocaleString 的输出一致,而这不是按照规范设计的。

所以你可以选择:

  1. 保留对原始日期或产生日期的字符串的引用
  2. 改为使用 toString ,这仍然依赖于操作,但parse their own format需要浏览器(但在某些情况下,浏览器仍会出错)
  3. 使用可以可靠解析的明确格式(即不使用内置解析器),例如: d-MMM-YYYY
  4. 选项1是迄今为止最好的。

    PS。

    您可以通过删除所有非数字来更简单地将字符串解析为日期:

    var s = '/Date(1511532984927)';
    var d = new Date(+s.replace(/\D/g,''));
    
    console.log(d.toLocaleString());