Ext JS框架中日期函数的用法及日期选择控件的实现


Posted in Javascript onMay 21, 2016

Ext.Date是一个单例,封装了一系列日期操作函数,扩展JavaScript Date的功能,下面列出一些常用的功能。
基本函数:

  • Ext.Date.add(date, interval, value) 给date增加或减少时间,这个函数不改变原有Date对象的值,而是返回一个新的Date对象。
  • Ext.Date.between(date, start, end) 判断date是否在start和end之间。
  • Ext.Date.clearTime(date, clone) 把date的时间设置成00小时00分00秒000毫秒。
  • Ext.Date.clone(date) 克隆date的一个副本。
  • Ext.Date.format(date, format)把日期格式化,返回格式化后的字符串。
  • Ext.Date.getDayOfYear(date)获取date是年中的第几天。
  • Ext.Date.getDaysInMonth(date)获取date是月中的第几天。
  • Ext.Date.getFirstDateOfMonth(date)获取date所在月份的第一天。
  • Ext.Date.getFirstDayOfMonth(date)获取date所在月份第一天的星期。
  • Ext.Date.getLastDateOfMonth(date)获取date所在月份的最后一天。
  • Ext.Date.getLastDayOfMonth(date)获取date所在月份最后一天的星期。
  • Ext.Date.getWeekOfYear(date) 获取date所在年中的第几个星期。
  • Ext.Date.isLeapYear(date)date所在年份是否闰年。
  • Ext.Date.now() 返回当前时间到1970年1月1日的毫秒数。在chrome、ie9和ie10中已经有Date.now()实现相同的功能。
  • Ext.Date.parse(input, format, strict)根据输入的字符串创建日期,Date.parse()有类似的功能。

下面零碎地举几个例子综合来看一下:

// Ext.Date.add(date, interval, value) 给date增加或减少时间,这个函数不改变原有Date对象的值,而是返回一个新的Date对象。 
// @param  {Date}  date   原日期对象。 
// @param  {String} interval value的单位,可以选Ext.Date.DAY、Ext.Date.HOUR、Ext.Date.MINUTE、Ext.Date.MONTH、 
//               Ext.Date.SECOND、Ext.Date.YEAR、Ext.Date.MILLI。 
// @param  {number} value   日期对象需要增加的值。 
// @return {Date}       返回增加值后的Date对象。 
// Example 
var date = Ext.Date.add(new Date('10/29/2006'), Ext.Date.DAY, 5); //增加5天 
console.log(date); //返回结果 Fri Nov 03 2006 00:00:00 GMT+0800 (中国标准时间) 
 
var date = Ext.Date.add(new Date('10/29/2006'), Ext.Date.DAY, -5); //减少5天,如果值是负数,则减少。 
console.log(date); //返回结果 Tue Oct 24 2006 00:00:00 GMT+0800 (中国标准时间) 
 
var date = Ext.Date.add(new Date('10/29/2006'), Ext.Date.YEAR, 2); //增加2年 
console.log(date); //返回结果 Wed Oct 29 2008 00:00:00 GMT+0800 (中国标准时间) 
 
 
// Ext.Date.between(date, start, end) 判断date是否在start和end之间。 
// @param  {Date}   date  要判断的日期。 
// @param  {Date}   start  
// @param  {Date}   end 
// @return {Boolean}     如果date在start和end之间返回true,否则返回false。 
// Example 
var date = new Date('10/29/2006'); 
var start = new Date('10/5/2006'); 
var end = new Date('11/15/2006'); 
Ext.Date.between(date, start, end); //返回true 
 
 
// Ext.Date.clearTime(date, clone) 把date的时间设置成00小时00分00秒000毫秒。 
// @param  {Date}   date  
// @param  {Bollean} clone 可选参数。如果为true则返回date的一个副本,如果为false则返回date本身,默认为false。 
// @return {Date}      返回设置后的日期。 
// Example 
var date = new Date('10/30/2012 14:30:00'); 
Ext.Date.clearTime(date); //返回 Tue Oct 30 2012 00:00:00 GMT+0800 (中国标准时间) 
 
 
// Ext.Date.clone(date) 克隆date的一个副本。 
// @param  {Date} date 
// @return {Date} 返回克隆后的Date。 
// Example 
var orig = new Date('10/30/2012'); 
var copy = Ext.Date.clone(orig); //克隆一个值 
 
 
// Ext.Date.format(date, format) 把日期格式化,返回格式化后的字符串。 
// @param  {Date}  date  日期。 
// @param  {String} format 日期格式,Y-年,m-月,d-日,H-24小时,i-分钟,s-秒 
// @return {String}     返回格式化后的字符串。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.format(date, 'Y-m-d H:i:s');    // 2012-10-20 14:30:00 
Ext.Date.format(date, 'Y年m月d日 H:i:s');  // 2012年10月20日 14:30:00 
 
 
// Ext.Date.getDayOfYear(date) 获取date是年中的第几天 
// @param  {Date}  date 日期。 
// @return {Number}    返回天数,取值范围0~364,如果是闰年则有365。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getDayOfYear(date); //返回 293 
 
 
// Ext.Date.getDaysInMonth(date) 获取date是月中的第几天 
// @param  {Date}  date 日期。 
// @return {Number}    返回天数。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getDayOfYear(date); //返回 31 
 
 
// Ext.Date.getFirstDateOfMonth(date) 获取date所在月份的第一天 
// @param  {Date} date 日期。 
// @return {Date}    返回所在月份的第一天。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getFirstDateOfMonth(date); //返回 Mon Oct 01 2012 00:00:00 GMT+0800 (中国标准时间) 
 
 
// Ext.Date.getFirstDayOfMonth(date) 获取date所在月份第一天的星期 
// @param  {Date}  date 日期。 
// @return {Number}    返回所在月份第一天的星期,取值范围0~6。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getFirstDayOfMonth(date); //返回 1,表示星期一 
 
 
// Ext.Date.getLastDateOfMonth(date) 获取date所在月份的最后一天 
// @param  {Date} date 日期。 
// @return {Date}    返回所在月份的最后一天。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getLastDateOfMonth(date); //返回 Wed Oct 31 2012 00:00:00 GMT+0800 (中国标准时间) 
 
 
// Ext.Date.getLastDayOfMonth(date) 获取date所在月份最后一天的星期 
// @param  {Date}  date 日期。 
// @return {Number}    返回所在月份最后一天的星期,取值范围0~6。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getLastDayOfMonth(date); //返回 3,表示星期三 
 
 
// Ext.Date.getWeekOfYear(date) 获取date所在年中的第几个星期 
// @param  {Date}  date 日期。 
// @return {Number}    返回所在年中的第几个星期,取值范围1~53。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.getWeekOfYear(date); //返回 42 
 
 
// Ext.Date.isLeapYear(date) date所在年份是否闰年 
// @param  {Date}   date 日期。 
// @return {Boolean}    true表示闰年,false表示平年。 
// Example 
var date = new Date('10/20/2012 14:30:00'); 
Ext.Date.isLeapYear(date); //返回 true 
 
 
// Ext.Date.now()   返回当前时间到1970年1月1日的毫秒数。 
//          在chrome、ie9和ie10中已经有Date.now()实现相同的功能。 
// @return {Number} 返回毫秒数。 
// Example 
var timestamp = Ext.Date.now(); //1351666679575 
var date = new Date(timestamp); //Wed Oct 31 2012 14:57:59 GMT+0800 (中国标准时间) 
 
 
// Ext.Date.parse(input, format, strict) 根据输入的字符串创建日期,Date.parse()有类似的功能。 
// @param {String}  input  日期字符串。 
// @param {String}  format 日期格式。 
// @param {Boolean} strict 验证input字符串的有效性,默认是false。 
// @param {Date}       返回创建的日期。 
// Example 
var input = '2012年10月31日 14:30:00'; 
var format = 'Y年m月d日 H:i:s'; 
var date = Ext.Date.parse(input, format, true); //Wed Oct 31 2012 14:30:00 GMT+0800 (中国标准时间)

 

实例:实现带week(星期)的日期选择控件
1.问题:

是否使用了Ext JS 就可以完美的解决 星期的问题呢?

在本系列的第一篇就有说到, Ext 的datepicker 并不能看到星期, 需要自己去扩展。

但是, 扩展的时候就有一个问题了:

Javascript 语言的Date对象每周是从星期天开始。

而Ext JS的getWeekOfYear这个方法却又是遵循 ISO-8601, 每周是从星期一开始的。(其他的方法又有不是遵循此标准的, Ext JS混合了不同的日期时间表示标准)。

Ext.Date.getWeekOfYear 这个方法的返回值是 1- 53 之间的数。

这样的话, 就会出现一些问题:

Ext js 的日期显示控件的显示是从星期天开始: (S M T W T F S (星期天 星期一 星期二  .. 星期六))

但是, 通过选中的时间获取星期时却又是从星期天开始。导致:

每个星期天的星期会小1 (比如2013/08/18 , 星期天, 应该是34周,但是通过这个方法却是算成上一周的结尾 , 33 周)
date = new Date("2013/08/18");
var week = Ext.Date.getWeekOfYear(date);
alert("week="+week);
Ext Js 日期控件默认显示了 42天, 这样的话,在两个年交互的地方就会出现问题
是当年显示 53 周呢? 还是下一年的第一周。

2.解决方案:

结合js 的Date 对象和 Ext js的Ext.Date, 实现获取星期字串。

每周以星期天为第一天

每年的周数从(1-52), 如果超过52 周,算到下一年的第一周。 比如2013/12/29 为 2013年的53周, 算到 2014年的第一周

返回 “W1334” 这样的周的格式

/*
 * return as W1334()2013/08/20
 * 1. if sunday==> week = week+1
 * getWeekOfYear(Ext use ISO-8601,week begin monday)
 * js Date(week begin sunday)
 * 2. if week > 52==> year = year +1; week = week - 52;
 * 3. if month ==11(12 month) and week <2 ==> year = year +1;
 */
function getWeekStrOfDate(date)
{
  var weekStr = null;
  if(date!=null)
  {
    weekStr = "W";
    var dateYear = date.getFullYear();
    var dateWeek = Ext.Date.getWeekOfYear(date);
    var firstDayOfMonth = Ext.Date.getFirstDayOfMonth(date);
    var day = date.getDate();
    var month = date.getMonth();
    //weekday 0-6
    var weekday = date.getDay();
    if(weekday===0)
    {
      dateWeek++;
    }

    // week>52 ==> year +1     
    if(month==11)
    {
      if(dateWeek>52)
      {    
        dateYear += 1;
        dateWeek -= 52;
      }else if(dateWeek<2){
        dateYear += 1;
      }
    }    
    var yearStr = dateYear.toString();
    yearStr = yearStr.substring(2,4);
    var dateWeekStr = dateWeek.toString();
    if(dateWeekStr.length<2)
    {
      dateWeekStr = "0" + dateWeekStr;
    }    
    weekStr += yearStr;
    weekStr += dateWeekStr;   
  }
  return weekStr;
}
Javascript 相关文章推荐
最短的IE判断代码
Mar 13 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
html5 canvas 详细使用教程
Jan 20 Javascript
js实现水平滚动菜单导航
Jul 21 Javascript
详解webpack进阶之loader篇
Aug 23 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 jQuery
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
layui复选框的全选与取消实现方法
Sep 02 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 #Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 #Javascript
javascript RegExp 使用说明
May 21 #Javascript
js+html5实现canvas绘制椭圆形图案的方法
May 21 #Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 #Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 #Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
May 21 #Javascript
You might like
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
php的4种常用运行方式详解
2016/12/22 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
Python爬取梨视频的示例
2021/01/29 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
财务经理岗位职责
2013/11/09 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
交通安全标语
2014/06/06 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
负责培养人意见
2015/06/05 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
详解SQL报错盲注
2022/07/23 SQL Server