小demo连载系列3
博主自己封装了时间转换的函数,
分别能获取用户浏览器时区,时区时间转换,将给定日期计算为今天、昨天、前天(支持跨年,跨月)
demo下载地址(所有连载的demo都是免费):
http://download.csdn.net/detail/snow_finland/8968371
具体代码(由于写demo的时候,写了非常完备的代码注释,这里就不做赘述了):
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8" /> <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>Time Demo</title> </head> <body> <script type="text/javascript"> /* * Time Demo v 1.0.0 * Copyright 2015-08-06 Jane * * get_time_zone() 获取用户浏览器时区(东时区为正数,西时区为负数) * * format_time(time,type,return_type) 将时间戳转换为时间戳/时间 * time 格式为 '2015-08-06T12:00:00.000Z' 的时间戳字符串 * type 类型,0代表将0时区时间戳转换为8时区(用户浏览器时区),1代表将8时区(用户浏览器时区)时间戳转换为0时区 * return_type 输出类型,0代表输出时间字符串,格式为'2014-07-05 03:00:00',1代表输出时间戳字符串,格式为'2015-08-06T12:00:00.000Z' * * format_date(time,return_type) 格式化日期,计算为今天、昨天、前天、XX月XX日(同一年份)、XXXX年XX月XX日(不同年份) * time 格式为 '2015-08-06T12:00:00.000Z' 的时间戳字符串 * return_type 输出类型,0:输出格式为'今天/昨天/前天/XX月XX日(同一年份)/XXXX年XX月XX日(不同年份)',1:输出格式为'今天/昨天/前天/XX月XX日(同一年份)/XXXX年XX月XX日(不同年份) XX:XX' */ var time = { get_time_zone : function(){ // 获取格林威治时间和本地时间之间的时差(以分钟为单位),然后转换为时区(东时区为正数,西时区为负数) var d = new Date() var gmtHours = -(d.getTimezoneOffset()/60); return gmtHours }, format_time : function(time,type,return_type){ // 格式 time = '2015-08-06T12:00:00.000Z',type: 0(0->8),1(8->0),return_type:0(时间),1(时间戳) var self = this; // 获取时区 var time_gap = self.get_time_zone(); // 将时间戳字符串转换为便于加减修改的js日期时间对象 var o = time.replace('T',' ').replace('Z','').replace('-','/').replace('-','/').substring(0,19); var std = new Date(o); // 判断类型,对日期时间对象进行重设时间到对应时区时间 if(type == 0){ // 如果是0时区转换为8时区(用户浏览器时区),那么小时是加上时区数 std.setHours( std.getHours() + time_gap ); }else{ // 如果是8时区(用户浏览器时区)转换为0时区,那么是减去时区数 std.setHours( std.getHours() - time_gap ); } // 获取重设之后时间对象的各个参数 var tmp = { year : std.getFullYear(), month : std.getMonth() + 1, date : std.getDate(), hour : std.getHours(), minute : std.getMinutes(), second : std.getSeconds() } var time1; // 根据返回类型,组成最后的输出格式 if( return_type == 0 ){ // 输出时间字符串,格式为'2014-07-05 03:00:00' time1 = tmp.year + '-' + ( tmp.month < 10 ? '0' + tmp.month : tmp.month ) + '-' + ( tmp.date < 10 ? '0' + tmp.date : tmp.date ) + ' ' + ( tmp.hour < 10 ? '0' + tmp.hour : tmp.hour ) + ':' + ( tmp.minute < 10 ? '0' + tmp.minute : tmp.minute ) + ':' + ( tmp.second < 10 ? '0' + tmp.second : tmp.second ); }else{ // 输出时间戳字符串,格式为'2015-08-06T12:00:00.000Z' time1 = tmp.year + '-' + ( tmp.month < 10 ? '0' + tmp.month : tmp.month ) + '-' + ( tmp.date < 10 ? '0' + tmp.date : tmp.date ) + 'T' + ( tmp.hour < 10 ? '0' + tmp.hour : tmp.hour ) + ':' + ( tmp.minute < 10 ? '0' + tmp.minute : tmp.minute ) + ':' + ( tmp.second < 10 ? '0' + tmp.second : tmp.second ) + '.000Z'; } return time1; }, format_date : function(time,return_type){ // 格式 time = '2015-08-06T12:00:00.000Z',return_type:0(日期),1(日期+时间) // 获取今天js日期时间对象和各个需要的参数 var today = new Date(); var return_date = { y : today.getFullYear(), m : today.getMonth() + 1, d : today.getDate() } // 计算今天0点的时间戳(是一个数字,秒数) var stamp_today = Date.parse(return_date.y + '-' + ( return_date.m < 10 ? '0' + return_date.m : return_date.m ) + '-' + ( return_date.d < 10 ? '0' + return_date.d : return_date.d ) + 'T00:00:00.000Z'); // 分别计算出今天24点,今天0点(昨天24点),昨天0点(前天24点),前天0点 var stamp = []; stamp[0] = stamp_today + 86400000; // 今天24:00 stamp[1] = stamp_today; // 今天0:00,昨天24:00 stamp[2] = stamp_today - 86400000; // 昨天0:00,前天24:00 stamp[3] = stamp_today - 172800000; // 前天0:00 // 将需要比较的时间戳字符串转化为js日期时间对象,并且获取需要用到的参数 o = time.replace('T',' ').replace('Z','').replace('-','/').replace('-','/').substring(0,19); var std = new Date(o); format_o = { y : std.getFullYear(), m : std.getMonth() + 1, d : std.getDate(), t : ( std.getHours() < 10 ? '0'+std.getHours() : std.getHours() ) + ':' + ( std.getMinutes() < 10 ? '0'+std.getMinutes() : std.getMinutes() ) }; // 将需要比较的时间戳字符串转化为时间戳(秒数) var stamp_o = Date.parse(format_o.y + '-' + ( format_o.m < 10 ? '0' + format_o.m : format_o.m ) + '-' + ( format_o.d < 10 ? '0' + format_o.d : format_o.d ) + 'T' + format_o.t + ':00.000Z' ); var time1; // 比较需要计算的日期的秒数和今天24点,今天0点(昨天24点),昨天0点(前天24点),前天0点之间的关系, // 秒数落在今天24点,今天0点(昨天24点)即为今天 if(stamp_o >= stamp[1] && stamp_o < stamp[0]){ time1 = '今天'; // 秒数落在今天0点(昨天24点),昨天0点(前天24点)即为昨天 }else if(stamp_o >= stamp[2] && stamp_o < stamp[1]){ time1 = '昨天'; // 秒数落在昨天0点(前天24点),前天0点即为前天 }else if(stamp_o >= stamp[3] && stamp_o < stamp[2]){ time1 = '前天'; }else{ // 其它情况,如果为统一年份,那么是 XX月XX日 if(return_date.y == format_o.y){ time1 = ( format_o.m < 10 ? '0' + format_o.m : format_o.m ) + '月' + ( format_o.d < 10 ? '0' + format_o.d : format_o.d ) + '日'; // 不同年份,那么是 XXXX年XX月XX日 }else{ time1 = format_o.y + '年' + ( format_o.m < 10 ? '0' + format_o.m : format_o.m ) + '月' + ( format_o.d < 10 ? '0' + format_o.d : format_o.d ) + '日'; } } // 根据返回类型,判断是否要加上小时和分钟 if(return_type == 1){ time1 = time1 + ' ' + format_o.t; } return time1; } } window.onload = function(){ // 想要查看不同日期时间输出的效果,请改变下面这个变量的值,注意格式 var test_time = '2015-08-05T19:00:00.000Z'; document.write('获取用户浏览器和0时区的时差:' + time.get_time_zone() + '<br><br>'); document.write('0时区时间戳转换为用户浏览器时区的时间戳:' + time.format_time(test_time,0,1) + '<br>'); document.write('用户浏览器时区的时间戳转换为0时区时间戳:' + time.format_time(test_time,1,1) + '<br><br>'); document.write('0时区时间戳转换为用户浏览器时区的时间:' + time.format_time(test_time,0,0) + '<br>'); document.write('用户浏览器时区的时间戳转换为0时区时间:' + time.format_time(test_time,1,0) + '<br><br>'); document.write('计算今天、昨天、前天:' + time.format_date(test_time,0) + '<br>'); document.write('计算今天、昨天、前天包括时间:' + time.format_date(test_time,1) + '<br><br>'); document.write('根据0时区时间戳,计算浏览器时区的今天、昨天、前天:' + time.format_date(time.format_time(test_time,0,0),0) + '<br>'); document.write('根据0时区时间戳,计算浏览器时区的今天、昨天、前天包括时间:' + time.format_date(time.format_time(test_time,0,0),1) + '<br><br>'); } </script> </body> </html>