简介JavaScript通过一个强大的对象:date为我们提供了日期处理功能。本文_不_谈论Moment.js,我认为它是处理日期的最佳库,并且在处理日期时几乎应该始终使用它。日期对象日期对象实例表示单个时间点。尽管被命名为Date,它也处理时间。为了初始化Date对象,我们使用newDate()初始化Date对象,这将创建一个指向当前时刻的Date对象。在内部,日期以自1970年1月1日(UTC)以来的毫秒数表示。这个日期很重要,因为就计算机而言,这就是一切的开始。您可能熟悉UNIX时间戳:它表示自那个著名日期以来经过的秒数。重要提示:UNIX时间戳的原因是以秒为单位。JavaScript以毫秒记录原因。如果我们有一个UNIX时间戳,我们可以使用consttimestamp=1530826365newDate(timestamp*1000)实例化一个JavaScriptDate对象如果我们传递0,我们将得到一个表示1970年1月1日(UTC)时间的Date对象:newDate(0)如果我们传递的是字符串而不是数字,Date对象使用parse方法来确定你传递的日期。示例:newDate('2018-07-22')newDate('2018-07')//2018年7月1日,00:00:00newDate('2018')//2018年1月1日,00:00:00newDate('07/22/2018')newDate('2018/07/22')newDate('2018/7/22')newDate('July22,2018')newDate('July22,201807:22:13')新日期('2018-07-2207:22:13')新日期('2018-07-22T07:22:13')新日期('2018年3月25日')新日期('2018年3月25日')新日期('2018年3月25日')新日期('2018年3月25日')新日期('2018年3月25日')新日期('2018年3月')//2018年3月1日,00:00:00newDate('2018March')//2018年3月1日,00:00:00newDate('2018MARCH')//2018年3月1日,00:00:00newDate('2018march')//Mar2018年1日,00:00:00这里有很多灵活性。您可以添加或省略月份或日期的前导零。小心月/日的位置,否则您可能最终会误解当天的月份。您还可以使用Date.parse:Date.parse('2018-07-22')Date.parse('2018-07')//2018年7月1日,00:00:00Date.parse('2018')//2018年1月1日,00:00:00Date.parse('07/22/2018')Date.parse('2018/07/22')Date.parse('2018/7/22')Date.parse('七月22,2018')Date.parse('2018年7月22日07:22:13')Date.parse('2018-07-2207:22:13')Date.parse('2018-07-22T07:22:13')Date.parse将返回时间戳(以毫秒为单位)而不是Date对象。您还可以传递一组有序的值,表示日期的各个部分:年、月(从0开始)、日、时、分、秒和毫秒:newDate(2018,6,22,7,22,13,0)newDate(2018,6,22)应该至少有3个参数,但大多数JavaScript引擎解释的少于这些:newDate(2018,6)//SunJul01201800:00:00GMT+0200(CentralEuropeanSummerTime)newDate(2018)//ThuJan01197001:00:02GMT+0100(欧洲中部标准时间)在任何这些情况下,生成的日期都是相对于计算机时区的。这意味着对于同一个日期对象,两台不同的计算机可能会输出不同的值。JavaScript没有任何关于时区的信息,会将日期视为UTC并自动转换为当前计算机的时区。因此,总结一下,有4种方法可以在不传递参数的情况下创建一个新的Date对象,创建一个表示“现在”的Date对象并传递一个数字,表示从1970年1月1日00:00GMT毫秒开始表示日期的字符串传递一组参数,这些参数表示日期时区的不同部分初始化日期时,您可以传递时区,这样日期就不会被假定为UTC,然后转换为您当地的时区。您可以通过以+HOURS格式添加时区来指定时区,或者通过添加括在括号中的时区名称来指定时区:newDate('July22,201807:22:13+0700')newDate('July22,201807:22:13(CET)')如果在括号中指定了错误的时区名称,JavaScript将默认为UTC而不会报错。如果您指定了错误的数字格式,JavaScript将报告“无效日期”错误。日期转换和格式化给定一个日期对象,有许多方法可以从该日期生成一个字符串:constdate=newDate('July22,201807:22:13')date.toString()//"2018年7月22日星期日07:22:13GMT+0200(中欧夏令时)"date.toTimeString()//"07:22:13GMT+0200(中欧夏令时)"date.toUTCString()//"Sun,22Jul201805:22:13GMT"date.toDateString()//"SunJul222018"date.toISOString()//"2018-07-22T05:22:13.000Z"(ISO8601格式)日期.toLocaleString()//"22/07/2018,07:22:13"date.toLocaleTimeString()//"07:22:13"date.getTime()//1532236933000date.getTime()//1532236933000Date对象getter方法Date对象提供了几种检查其值的方法。这些都取决于计算机的当前时区:constdate=newDate('July22,201807:22:13')date.getDate()//22date.getDay()//0(0表示星期日,1表示monday..)date.getFullYear()//2018date.getMonth()//6(从0开始)date.getHours()//7date.getMinutes()//22date.getSeconds()//13date.getMilliseconds()//0(未指定)date.getTime()//1532236933000date.getTimezoneOffset()//-120(将根据您所在的位置和检查时间而有所不同-这是夏季的CET)。返回以分钟表示的时区差异这些方法具有等效的UTC版本,它们返回UTC值而不是适合您当前时区的值:date.getUTCDate()//22date.getUTCDay()//0(0表示星期日,1表示星期一..)日期。getUTCFullYear()//2018date.getUTCMonth()//6(从0开始)date.getUTCHours()//5(不是上面的7)date.getUTCMinutes()//22date.getUTCSeconds()//13date.getUTCMilliseconds()//0(notspecified)EditDateDate对象提供了几种编辑日期值的方法:constdate=newDate('July22,201807:22:13')date.setDate(newValue)date.setDay(newValue)date.setFullYear(newValue)//注意:避免使用setYear(),它已被弃用setDay和setMonth从0开始编号,所以例如March是February您可以在setHours()中添加多个参数来设置分钟、秒和毫秒:setHours(0,0,0,0)-同样适用于setMinutes和setSeconds。至于get_,set_方法也有UTC等价物:constdate=newDate('July22,201807:22:13')date.setUTCDate(newValue)date.setUTCDay(newValue)date.setUTCFullYear(newValue)date。setUTCMonth(newValue)date.setUTCHours(newValue)date.setUTCMinutes(newValue)date.setUTCSeconds(newValue)date.setUTCMilliseconds(newValue)获取当前时间戳如果想获取当前时间戳的毫秒数,可以使用简写Date。now()而不是newDate().getTime()JavaScript关于日期的容错处理的注意事项。如果用天数计算超过一个月,不会有错误,日期会顺延到下个月:newDate(2018,6,40)//ThuAug09201800:00:00GMT+0200(欧洲中部夏令时)表示月、时、分、秒和毫秒。根据语言环境格式化日期现代浏览器中良好支持的国际化API(明显的例外:UC浏览器)允许您翻译日期。它由IntlObject公开,这也有助于本地化数字、字符串。我将看一下Intl.DateTimeFormat()。下面是如何使用它。根据计算机的默认语言环境格式化日期://"12/22/2017"constdate=newDate('July22,201807:22:13')newIntl.DateTimeFormat().format(date)//“22/07/2018”inmylocale根据不同的区域设置格式化日期:newIntl.DateTimeFormat('en-US').format(date)//"7/22/2018"Intl.DateTimeFormatmethodtakesoptional允许您自定义输出以显示小时、分钟和秒的参数:constoptions={year:'numeric',month:'numeric',day:'numeric',hour:'numeric',minute:'numeric',第二个:'numeric'}newIntl.DateTimeFormat('en-US',options).format(date)//"7/22/2018,7:22:13AM"newIntl.DateTimeFormat('it-IT',options2).format(date)//"22/7/2018,07:22:13"这是您可以使用的所有属性的参考。比较两个日期您可以使用Date.getTime()来计算两个日期之间的差异:constdate1=newDate('July10,201807:22:13')constdate2=newDate('July22,201807:22:13')constdiff=date2.getTime()-date1.getTime()//以毫秒为单位的差异用同样的方法你可以检查两个日期是否相等:constdate1=newDate('July10,201807:22:13')constdate2=newDate('July10,201807:22:13')if(date2.getTime()===date1.getTime()){//datesareequal}请记住,getTime()返回毫秒,因此您需要将时间纳入比较。2018-07-1007:22:13不等于2018-07-10。在这种情况下,您可以使用setHours(0,0,0,0)重置小时数。
