Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
390 views
in Technique[技术] by (71.8m points)

javascript - 将ISO日期字符串更改为Date对象-JavaScript(Change ISO Date String to Date Object - JavaScript)

I am stuck in a weird situation and unfortunately,even after doing some RnD and googling, i am unable to solve this problem.

(我陷入了一个奇怪的情况,不幸的是,即使经过一些RnD和谷歌搜索之后,我也无法解决这个问题。)

I have a date string in ISO format, like 2014-11-03T19:38:34.203Z and i want to convert it into a date object with new Date() method.

(我有一个ISO格式的日期字符串,例如2014-11-03T19:38:34.203Z ,我想用new Date()方法将其转换为日期对象。)

But when i do so, output is:

(但是当我这样做时,输出是:)

var isoDate = '2014-11-03T19:38:34.203Z';
console.log(new Date(isoDate)); //output is: Tue Nov 04 2014 01:08:34 GMT+0530 (IST)

The date which i passed is of 3 Nov,2014 and the output is 4 Nov,2014 and it's because of GMT +5.30 of our local time(IST).

(我通过的日期是3 Nov,2014输出是4 Nov,2014这是因为我们当地时间(IST)的格林尼治标准时间+5.30。)

So, is there any generic method with which i can get the date object which return the date of Nov 3,2014 .

(因此,是否有任何通用方法可以用来获取返回日期为Nov 3,2014日的date对象。)

NOTE : I don't have any issues with timestamp.

(注意 :时间戳没有任何问题。)

We can change time string to zero with setHours() method.

(我们可以使用setHours()方法将时间字符串更改为零。)

The only thing which i want is date object like new Date() having date of 3 Nov,2014 .

(我唯一想要的是date对象,例如new Date()其日期为3 Nov,2014 。)

  ask by Mohit Pandey translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Do not pass strings to the Date constructor, it is notoriously bad at parsing strings.

(不要将字符串传递给Date构造函数,这在解析字符串时非常糟糕。)

IE 8, for one, will not parse ISO 8601 format strings at all and return NaN .

(IE 8完全不会解析ISO 8601格式的字符串,并返回NaN 。)

It's really simple to write your own parser:

(编写自己的解析器非常简单:)

function parseISOString(s) {
  var b = s.split(/D+/);
  return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6]));
}

Note also that if the time is 19:38:34.203 UTC and your timezone is UTC +0530, then the time in that timezone is 01:08:34 am on the following day, hence the difference in dates.

(还要注意,如果时间是UTC时间19:38:34.203,并且您的时区是UTC +0530,那么该时区中的时间是第二天的01:08:34,因此日期有所不同。)

For example, for a person on the east coast of Australia but not observing daylight saving (ie UTC +10), it's equivalent to:

(例如,对于一个在澳大利亚东海岸但未遵守夏令时(即UTC +10)的人,它等同于:)

4 November, 2014 05:38:34

Edit(编辑)

So if you want to return it to an ISO date, you can use the getISO* methods to create whatever format that suits, eg

(因此,如果要将其恢复为ISO日期,则可以使用getISO *方法创建适合的任何格式,例如)

function isoFormatDMY(d) {  
  function pad(n) {return (n<10? '0' :  '') + n}
  return pad(d.getUTCDate()) + '/' + pad(d.getUTCMonth() + 1) + '/' + d.getUTCFullYear();
}

var s = '2014-11-03T19:38:34.203Z';
var date = parseISOString(s);

console.log(isoFormatDMY(date)) // 03/11/2014

or use ES5's toISOString :

(或使用ES5的toISOString :)

 parseISOString('2014-11-03T19:38:34.203Z').toISOString(); // 2014-11-03T19:38:34.203Z

A simple polyfill for pre ES5 browsers:

(适用于ES5之前版本浏览器的简单polyfill:)

if (!Date.prototype.toISOString) {

  Date.prototype.toISOString = function() {

    var d = this;

    // Padding functions 
    function pad(n) {return (n<10? '0' :  '') + n}
    function padd(n){return (n<100? '0' : '') + pad(n)}

    return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) +
           'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + 
           pad(d.getUTCSeconds()) + '.' + padd(d.getMilliseconds()) + 'Z';
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...