一、什么是ISO 8601日期时间格式

ISO 8601是国际标准化组织制定的日期时间表示规范,全称是《数据存储和交换形式·信息交换·日期和时间的表示方法》。

示例:

1. 2014-12-12T00:00:00.000Z

2. 2014-12-12T00:00:00.000+08

3. 2014-12-12T00:00:00.000+0800

4. 2014-12-12T00:00:00.000+08:00

5. 2004-W17-3

6. 0001-165

详细说明请参考度娘:http://baike.baidu.com/link?url=Qr7NLClAyUHihOCl1DK6DQL_gMw5rk3euXdiz3zt6M9ORGFS2XBy7LHmcO2ID-iz

二、Javascript中实现的ISO 8601日期时间格式

度娘后大家应该对ISO 8061有一定的了解了吧。ISO 8601的内容十分丰富,可惜Javascript仅仅实现一小部分而已,不过这一部分就够我们用了。

javascript支持的ISO 8061格式如下:

1. 2014-12-12T00:00:00.000Z

 2. 2014-12-12T00:00:00.000+0800

3. 2014-12-12T00:00:00.000+08:00

二、ES5中涉及ISO 8061日期时间格式的方法

 1.  Date.parse({String} datetime) :接收ISO 8061和GMT的日期时间格式字符串(根据格式内容被识别为0时区或其他时区的日期时间),返回入参所表示的0时区日期时间距离1970年1月1日的毫秒数。

2.  Date.prototype.toISOString() :返回当前Date类型对象0时区的ISO 8061日期时间格式字符串。形如:2014-12-12T00:00:00.000Z

3.  new Date({String} datetime) :构造函数的入参在ES5中新增接收ISO 8061格式字符串,其实内部就是调用 Date.parse({String} datetime) 进行转换。

4.  Date.prototype.toJSON() :返回当前Date类型对象0时区的ISO 8061日期时间格式字符串。形如:2014-12-12T00:00:00.000Z。

三、认识ES3下的Date类型

 1. 作为构造函数使用

/**
* 第一种入参模式:无入参,实例化当前日期时间的Date对象
*/
var date1 = new Date(); /**
* 第二种入参模式:短日期格式字符串入参,实例化当前时区日期时间的Date对象
*/
var date2 = new Date('2014/12/3'); /**
* 第三种入参模式:长日期格式字符串入参,实例化当前时区日期时间的Date对象
*/
var date3 = new Date('Aug 3, 2014'); /**
* 第四种入参模式:GMT日期格式字符串入参,实例化指定时区日期时间的Date对象
*/
var date4 = new Date('Tue May 25 2014 00:00:00 GMT +0800'); /**
* 第五种入参模式:GMT日期格式字符串入参,实例化0时区日期时间的Date对象
*/
var date5 = new Date('Tue May 25 2014 00:00:00 GMT'); /**
* 第六种入参模式:入参依次为年、月、日、时、分、秒和毫秒的数值(其中仅年和月为必填项,日默认值为1,其他默认值为0),实例化当前时区日期时间的Date对象
*/
var date6 = new Date(,,,,,,);

   2. 作为函数使用

// 无论入参是什么,总返回当前时区的GMT日期时间格式的字符串
var dateStr = Date();

   3. 类成员

3.1.  Date.parse({String} datetime) :接收GMT的日期时间格式字符串(根据GMT格式内容被识别为0时区或其他时区的日期时间),返回入参所表示的0时区日期时间距离1970年1月1日的毫秒数

3.2.  Date.UTC(Y,M,d,H,m,s,ms) :设置0时区的日期时间,返回入参所表示的0时区日期时间距离1970年1月1日的毫秒数

   4. 部分实例成员

  4.1.  Date.prototype.toGMTString() :返回当前Date对象的GMT日期时间格式字符串(仅为了向后兼容而已)

  4.2.  Date.prototype.toUTCString() :返回当前Date对象的GMT日期时间格式字符串(建议使用该方法)

四、一起Polyfill

    if (!Date.prototype.toISOString){
var isLeapYear = function(year){
return (year % === ) || (year % === && year % !== );
};
var operHoursAndMinutes = {};
operHoursAndMinutes['+'] = function(minusHours, minusMinutes, year, month, date, hours, minutes, seconds, milliseconds){
var ret = {};
minutes -= minusMinutes;
hours -= minusHours;
if (minutes < ){
hours -= ;
minutes += ;
}
if (hours < ){
--date;
hours += ;
if (date < ){
--month;
if (month < ){
--year;
month = ;
}
if (month % === ){
date += ;
}
else if (month === )
{
date += isLeapYear(year) ? : ;
}
else{
date += ;
} if (month < ){
--year;
month += ;
}
}
} ret.year = year;
ret.month = month;
ret.date = date;
ret.hours = hours;
ret.minutes = minutes;
ret.seconds = seconds;
ret.milliseconds = milliseconds; return ret;
};
operHoursAndMinutes['-'] = function(addHours, addMinutes, year, month, date, hours, minutes, seconds, milliseconds){
var ret = {}; minutes += addMinutes;
hours += addHours;
if (minutes >= ){
hours += ;
minutes -= ;
}
if (hours >=){
++date;
hours -= ;
var dateOfCurrMonth = month % === ? : (month === ? (isLeapYear(year) ? : ) : );
if (date >= dateOfCurrMonth){
++month;
date -= dateOfCurrMonth; if (month >= ){
++year;
month -= ;
}
}
} ret.year = year;
ret.month = month;
ret.date = date;
ret.hours = hours;
ret.minutes = minutes;
ret.seconds = seconds;
ret.milliseconds = milliseconds; return ret;
};
var regExp = new RegExp('^(\\d{4,4})'
+ '-((?:0[123456789]|1[012]))'
+ '-((?:0[123456789]|[12]\\d|3[01]))'
+ 'T'
+ '((?:[01]\\d|2[0123]))'
+ ':([012345]\\d)'
+ ':([012345]\\d)'
+ '(?:.(\\d{3}))?'
+ '(Z|[+-](?:[01]\\d|2[0123]):?[012345]\\d)$');
var parseISOString2UTC = function(ISOString){
var ret = {};
var year = Number(RegExp.$)
, month = Number(RegExp.$) -
, date = Number(RegExp.$)
, hours = Number(RegExp.$)
, minutes = Number(RegExp.$)
, seconds = Number(RegExp.$)
, offset = RegExp.$
, milliseconds;
milliseconds = (milliseconds = Number(RegExp.$), !isNaN(milliseconds) && milliseconds || ); if (offset === 'Z'){
ret.year = year;
ret.month = month;
ret.date = date;
ret.hours = hours;
ret.minutes = minutes;
ret.seconds = seconds;
ret.milliseconds = milliseconds;
}
else if (typeof offset !== 'undefined'){
var symbol = offset.charAt();
var offsetHours = Number(offset.substring(,));
var offsetMinutes = Number(offset.substring(offset.length > ? : )); ret = operHoursAndMinutes[symbol](offsetHours, offsetMinutes, year, month, date, hours, minutes, seconds, milliseconds);
} return ret;
}; var _nativeDate = Date;
Date = function(Y,M,D,H,m,s,ms){
var ret, len = arguments.length;
if (!(this instanceof Date)){
ret = _nativeDate.apply(null, arguments);
}
else if (len === && typeof arguments[] === 'string' && regExp.test(arguments[])){
var tmpRet;
try{
tmpRet = parseISOString2UTC();
}
catch(e){
console && console.log('Invalid Date');
return void ;
} ret = new _nativeDate(_nativeDate.UTC(tmpRet.year, tmpRet.month, tmpRet.date, tmpRet.hours, tmpRet.minutes, tmpRet.seconds, tmpRet.milliseconds));
}
else if (typeof arguments[] === 'string'){
ret = new _nativeDate(arguments[]);
}
else{
ret = len >= ? new _nativeDate(Y, M, D, H, m, s, ms)
: len >= ? new _nativeDate(Y, M, D, H, m, s)
: len >= ? new _nativeDate(Y, M, D, H, m)
: len >= ? new _nativeDate(Y, M, D, H)
: len >= ? new _nativeDate(Y, M, D)
: len >= ? new _nativeDate(Y, M)
: len >= ? new _nativeDate(Y)
: new _nativeDate();
} return ret;
};
Date.prototype = _nativeDate.prototype;
Date.prototype.constructor = Date; var _pad = function(num){
if (num < ){
return '' + num;
}
return num;
};
var _padMillisecond = function(num){
if (num < ){
return '' + num;
}
else if (num < ){
return '' + num;
}
return num;
};
Date.prototype.toISOString = function(){
return [this.getUTCFullYear(), '-', _pad(this.getUTCMonth() + ), '-', _pad(this.getUTCDate()), 'T'
, _pad(this.getUTCHours()), ':', _pad(this.getUTCMinutes()), ':', _pad(this.getUTCSeconds()), '.', _padMillisecond(this.getUTCMilliseconds()), 'Z'].join('');
}; // 复制可枚举的类成员
for (var clsProp in _nativeDate){
if (_nativeDate.hasOwnProperty(clsProp)){
Date[clsProp] = _nativeDate[clsProp];
}
}
// 复制不可枚举的类成员
var innumerableMems = ['UTC'];
for (var i = , clsProp; clsProp = innumerableMems[i++];){
Date[clsProp] = _nativeDate[clsProp];
} Date.parse = function(str){
if (['string', 'number'].indexOf(typeof str) === -) return NaN; var isMatch = regExp.test(str), milliseconds = ;
if (!isMatch) return _nativeDate.parse(str); var tmpRet = parseISOString2UTC(); return _nativeDate.UTC(tmpRet.year, tmpRet.month, tmpRet.date, tmpRet.hours, tmpRet.minutes, tmpRet.seconds, tmpRet.milliseconds);
};
Date.now = Date.now
|| function(){
return +new this();
};
}

五、总结

上述实现相对es5-shim来讲考虑的地方仍有欠缺,这源于我对日期时间格式的理解不够完整,因此请大家多多见谅。

原创文章,转载请注明来自^_^肥仔John[http://fsjohnhuang.cnblogs.com]

本文地址:http://www.cnblogs.com/fsjohnhuang/p/3731251.html (本篇完)

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!
  

一起Polyfill系列:让Date识别ISO 8601日期时间格式的更多相关文章

  1. Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式

    Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...

  2. 常用类(日期时间格式转换,date,枚举)

    1 常用类 1.1 日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms ...

  3. DATE,DATETIME,DATETIME2等日期时间数据类型

    日期范围广 0001-01-01 到 9999-12-31.时间范围广 00:00:00 到 23:59:59.9999999. -----------------DATE --只存储日期 selec ...

  4. java Date日期类和SimpleDateFormat日期类格式

    ~Date表示特定的时间,精确到毫秒~构造方法:public Date()//构造Date对象并初始化为当前系统的时间public Date(long date) //1970-1-1 0:0:0到指 ...

  5. Java日期的格式String类型GMT,GST换算成日期Date种类

    请尊重他人的劳动成果.转载请注明出处:Java日期格式化之将String类型的GMT,GST日期转换成Date类型 http://blog.csdn.net/fengyuzhengfan/articl ...

  6. Java日期时间(Date/Time)

    获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; publ ...

  7. JavaScript中的内置对象-8--4.date对象中-获取,设置日期时间的方法; 获取,设置年月日时分秒及星期的方法;

    学习目标 1.掌握创建日期对象的方法 2.掌握date对象中获取日期时间的方法 3.掌握date对象中设置日期时间的方法 如何创建一个日期对象 语法:new Date(); 功能:创建一个日期时间对象 ...

  8. java日期时间Date类

    java.util包提供了Date类来封装当前的日期和时间. Date类提供两个构造函数来实例化Date对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参 ...

  9. Java时间格式字符串与Date的相互转化

    目录 将Date转化为格式化字符串 时间格式字符串转化为Date @ 将Date转化为格式化字符串 将Date转化为格式化字符串是利用SimpleDateFormat类继承自 java.text.Da ...

随机推荐

  1. WIN7、WIN8 右键在目录当前打开命令行Cmd窗口(图文)

    Win7系统大家习惯“Win+R”的组合键打开命令提示符. 通常右击文件夹是没有进入命令行 进入某个文件夹里面,先按住Shift键,然后鼠标右键,出现选项“在此处打开命令窗口(W)”也可以打开命令行. ...

  2. mybatis connection error Cannot create PoolableConnectionFactory (Access denied for user 'root '@'local

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste ...

  3. Java和Android文件操作

    File这是文件基类,抽象地代表一个文件实体,它有四个不同的构造方法: File(File dir, String name)  File(String path)   File(String dir ...

  4. 机器学习基石--学习笔记01--linear hard SVM

    背景 支持向量机(SVM)背后的数学知识比较复杂,之前尝试过在网上搜索一些资料自学,但是效果不佳.所以,在我的数据挖掘工具箱中,一直不会使用SVM这个利器.最近,台大林轩田老师在Coursera上的机 ...

  5. C#==>匿名方法 【转】

    http://blog.csdn.net/gishero/article/details/5161826 1,匿名方法 C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定 ...

  6. C# WinForm 技巧八:界面开发之“WeifenLuo.WinFormsUI.Docking+OutLookBar” 使用

    概述      最近几天一直在关注WinFrom方面的文章主要还是园子里伍华聪的博客,在看看我们自己写的项目差不忍赌啊,有想着提炼一下项目的公共部分,公共部分有分为 界面,类库两方面,今天主要是把界面 ...

  7. 获取枚举类型的描述description

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  8. ArcGIS Server API for JavaScript调用错误:已阻止跨源请求:同源策略禁止读取位于......

    已阻止跨源请求:同源策略禁止读取位于 http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapSe ...

  9. apache工作模式:prefork和worker

    apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...

  10. Angular 使用

    tks: 使用: http://developer.51cto.com/art/201302/380661.htm http://www.infoq.com/cn/news/2013/02/angul ...