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 相关文章推荐
JavaScript中的Document文档对象
Jan 16 Javascript
JS学习之一个简易的日历控件
Mar 24 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
javascript闭包传参和事件的循环绑定示例探讨
Apr 17 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
Aug 25 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
微信小程序实现页面浮动导航
Jan 08 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
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
Javascript注入技巧
2007/06/22 Javascript
摘自启点的main.js
2008/04/20 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
js中生成map对象的方法
2014/01/09 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
python 控制语句
2011/11/03 Python
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
python操作xml文件示例
2014/04/07 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
七夕活动策划方案
2014/08/16 职场文书
工作检讨书怎么写
2015/01/23 职场文书
员工升职自我评价
2019/03/26 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
Python实现自动玩连连看的脚本分享
2022/04/04 Python