JavaScript - 时间对象 Date

Date 类型提供了有关日期和时间的信息,包括当前日期和时间以及相关的计算功能。

创建日期对象:

var now = new Date();

构造函数不传参数情况下,新对象自动获得当前日期和时间。

如果想要更具特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数(即从UTC时间1970年1月1日午夜起至该日期止经过的毫秒数)。

为了简化这一计算过程,ECMAScript 提供了两个方法:

  • Date.parse():该方法接受一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。

    • ECMA-262没有定义 Date.parse() 应该支持那种日期格式,因此这个方法的行为因实现而异,而且通常是因地区而异。

    • "月/日/年",如 "6/13/2004"。

    • "因为月名 日,年",如 "January 12,2004"。

    • "因为星期几 因为月名 日 年 时:分:秒 时区",如 "TueMay 25 2004 00:00:00 GMT-0770"。

    • ISO 8601扩展格式YYYY-MM-DDTHH:mmSS.SSZ (例如:"2004-05-25T00:00:00")。只有兼容ECMAScript 5的实现支持这种格式。

      在一次项目的扩展中,使用 YYYY-MM-DDTHH:mmSS.SSZ 这个格式在 Safari 上就出现无法解析的问题,解决方式是把 '-' 转 成 '/'。

    // 创建 2004年5月25日的一个日期对象
    var someDate = new Date(Date.parse("May 25,2004"));
    
    // 如果传入Date.parse() 方法的字符串不能表示日期,那么它会返回NAN。实际上,如果直接将表示日期的字符创传递给Date构造函数,也会在后台调用 Date.parse():
    var someDate = new Date("May 25,2004"); // 这句代码与上句代码是等价的
    

    日期对象在不同浏览器中的实现有许多起卦的行为。其中有一种倾向是将超出范围的值替换成当前值,以便生成输出。

    例如:在接续 "January 32,2007"时,有的浏览器会将其解释为 "February 1,2007"。而Opera则倾向于插入当前月份的当前日期,返回 "January当前日期,2007"。

    也就是说,如果在2007年9月21日运行前面的代码,将会得到 "January 21,2007"(都是21日)。

  • Date.UTC():

Date.UTC()方法同样也返回表示日期的毫秒数,但它与 Date.parse() 在构建值时使用不同的信息。

  • 参数一:年份、基于0的月份(一月是0,二月是1,以此类推)
  • 参数二:月中的哪一天(1到31)
  • 参数三:小时数(0到23)
  • 参数四:分钟
  • 参数五:秒
  • 参数六:毫秒数

在这些参数中只有前两个参数(年和月)是必需的。

// GMT时间2000年1月1日午夜零时
var y2k = new Date(Date.UTC(2000, 0));

// GMT时间2005年5月5日下午5.:55:55
var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55));

// 本地时间2000年1月1日午夜零时
var y2k_1 = new Date(2000, 0);

// 本地时间2005年5月5日下午5:55:55
var allFives_1 = new Date(2005, 4, 5, 17, 55, 55);

ECMAScript 5 添加了 Date.now() 方法,返回表示调用这个方法时的日期和时间的毫秒数。这个方法简化了使用Date对象分析代码的工作。

// 取得开始时间
var start = Date.now();

// 调用函数
doSomething()

// 取得停止时间
var stop = Date.now(),
    result = stop - start;

获取一个方法的执行时间毫秒值

支持 Date.now() 方法的浏览器包括 IE9+、Firefox 3+、Safari 3+、Opera 10.5和Chrome。

// 取得开始时间
var start = +new Date();

// 调用函数
doSomething()

// 取得停止时间
var stop = +new Date();
    result = stop - start;

在不支持 Date.now() 方法的浏览器中,使用 '+' 操作符把Data对象转换成字符串,也可以得到毫秒值。

比较 Date 的大小

Date 类型的 ValueOf() 方法,不返回字符串,而是返回日期的毫秒表示。因此,可以方便使用比较操作符(大于或小于)来比较日期值。

var date1 = new Date(2007, 0, 1);
var date2 = new Date(2007, 1, 1);

alert(date1 < date2) // true
alert(date1 > date2) // false

日期格式化

Date 类型还有一些专门用于将日期格式化为字符串的方法:

  • toDateString():new Date().toDateString() // "Tue Oct 18 2016"
  • toTimeString():new Date().toTimeString() // "23:29:12 GMT+0800 (CST)"
  • toLocaleDateString():new Date().toLocaleDateString() // "2016/10/18"
  • toLocaleTimeString():new Date().toLocaleTimeString() // "下午11:30:28"
  • toUTCString():new Date().toUTCString() // "Tue, 18 Oct 2016 15:30:53 GMT"

日期/时间组件方法

方法 说明
getTime() 返回表示日期的毫秒数:与valueOf()方法返回的值相同
setTime(毫秒) 以毫秒数设置日期,会改变整个日期
getFullYear() 获取四位数的年丰(如 2007而非07)
getUTCFullYear() 返回UTC日期的4位数年份
setFullYear(年) 设置日起的年份,传入的年分支必须是4为数字(如 2007而非07)
setUTCFullYear(年) 设置UTC日期的年份。传入的年份值必须是4位数字(如 2007而非07)
getMonth() 返回日期中的月份,其中0表示一月,11表示十二月
getUTCMonth() 返回UTC日期中的月份,其中0表示一月,11表示十二月
setMonth() 设置日期的月份。传入的月份值必须大于0,超过11则增加年份
setUTCMonth() 设置UTC日期的月份。传入的月份值必须大于0,超过11则增加年份
getDate() 返回日期月份中的天数(1到31)
getUTCDate() 返回UTC日期月份中的天数(1到31)
setDate() 设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
setUTCDate(日) 设置UTC日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
getDay() 返回日期中清气得星期几(其中0表示星期日,6表示星期六)
getUTCDay() 返回UTC日期中清气得星期几(其中0表示星期日,6表示星期六)
getHours() 返回日期中的小时数(0到23)
getUTCHours() 返回UTC日期中的小时数(0到23)
setHours(时) 设置日期中的小时数,传入的超过了23则增加月份中的天数
setUTCHours(时) 设置UTC日期中的小时数,传入的超过了23则增加月份中的天数
getMinutes() 返回日期中的分钟数(0到59)
getUTCMinutes() 返回UTC日期中的分钟数(0到59)
settMinutes(分) 设置日期中的分钟数。传入的值超过59则增加小时数
settUTCMinutes(分) 设置UTC日期中的分钟数。传入的值超过59则增加小时数
getSeconds() 返回日期中的秒数(0到59)
getUTCSeconds() 返回UTC日期中的秒数(0到59)
setSeconds(秒) 设置日期中的秒数,传入的值超过59则增加分钟数
setUTCSeconds(秒) 设置UTC日期中的秒数,传入的值超过59则增加分钟数
getMillSeconds() 返回日期中的毫秒数
getUTCMillSeconds() 返回UTC日期中的毫秒数
settMillSeconds() 设置日期中的毫秒数
settUTCMillSeconds() 设置UTC日期中的毫秒数
getTimezoneOffset() 返回本地时间与UTC时间相差的分钟数。例如:美国东部标准时间返回300。在某地进入夏令时的情况下,这个值会有所变化

你可能感兴趣的:(JavaScript - 时间对象 Date)