Ext JS 4實(shí)現(xiàn)帶week(星期)的日期選擇控件(實(shí)戰(zhàn)二)
更新時(shí)間:2013年08月21日 15:24:14 作者:
Javascript 有提供Date 對象用于處理時(shí)間。但是Date 并沒有提供獲取星期的方法,jquery 的擴(kuò)展組件 等有直接提供這樣的一些現(xiàn)成包,感興趣的朋友可以了解下
前言
JavaScript 中的日期和時(shí)間
Ext JS 4實(shí)現(xiàn)帶week(星期)的日期選擇控件(實(shí)戰(zhàn)一)
如對本篇的一些預(yù)備知識需詳盡了解,可參考以上兩篇。
Javascript 有提供Date 對象用于處理時(shí)間。但是Date 并沒有提供獲取星期的方法。
要在web 端通過js 方式獲取某個(gè)時(shí)間是這一年的第幾個(gè)星期,可以根據(jù)一些算法去實(shí)現(xiàn)。 當(dāng)然, jquery 的擴(kuò)展組件 等有直接提供這樣的一些現(xiàn)成包。
像Ext js 就有提供獲取星期的方法 Ext.Date.getWeekOfYear(date).
問題
是否使用了Ext JS 就可以完美的解決 星期的問題呢?
在本系列的第一篇就有說到, Ext 的datepicker 并不能看到星期, 需要自己去擴(kuò)展。
但是, 擴(kuò)展的時(shí)候就有一個(gè)問題了:
Javascript 語言的Date對象每周是從星期天開始。
而Ext JS的getWeekOfYear這個(gè)方法卻又是遵循 ISO-8601, 每周是從星期一開始的。(其他的方法又有不是遵循此標(biāo)準(zhǔn)的, Ext JS混合了不同的日期時(shí)間表示標(biāo)準(zhǔn))。
Ext.Date.getWeekOfYear 這個(gè)方法的返回值是 1- 53 之間的數(shù)。
這樣的話, 就會(huì)出現(xiàn)一些問題:
Ext js 的日期顯示控件的顯示是從星期天開始: (S M T W T F S (星期天 星期一 星期二 .. 星期六))
但是, 通過選中的時(shí)間獲取星期時(shí)卻又是從星期天開始。導(dǎo)致:
1. 每個(gè)星期天的星期會(huì)小1 (比如2013/08/18 , 星期天, 應(yīng)該是34周,但是通過這個(gè)方法卻是算成上一周的結(jié)尾 , 33 周)
date = new Date("2013/08/18");
var week = Ext.Date.getWeekOfYear(date);
alert("week="+week);
2. Ext Js 日期控件默認(rèn)顯示了 42天, 這樣的話,在兩個(gè)年交互的地方就會(huì)出現(xiàn)問題
是當(dāng)年顯示 53 周呢? 還是下一年的第一周。
解決方案
結(jié)合js 的Date 對象和 Ext js的Ext.Date, 實(shí)現(xiàn)獲取星期字串。
1. 每周以星期天為第一天
2. 每年的周數(shù)從(1-52), 如果超過52 周,算到下一年的第一周。 比如2013/12/29 為 2013年的53周, 算到 2014年的第一周
3. 返回 “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 中的日期和時(shí)間
Ext JS 4實(shí)現(xiàn)帶week(星期)的日期選擇控件(實(shí)戰(zhàn)一)
如對本篇的一些預(yù)備知識需詳盡了解,可參考以上兩篇。
Javascript 有提供Date 對象用于處理時(shí)間。但是Date 并沒有提供獲取星期的方法。
要在web 端通過js 方式獲取某個(gè)時(shí)間是這一年的第幾個(gè)星期,可以根據(jù)一些算法去實(shí)現(xiàn)。 當(dāng)然, jquery 的擴(kuò)展組件 等有直接提供這樣的一些現(xiàn)成包。
像Ext js 就有提供獲取星期的方法 Ext.Date.getWeekOfYear(date).
問題
是否使用了Ext JS 就可以完美的解決 星期的問題呢?
在本系列的第一篇就有說到, Ext 的datepicker 并不能看到星期, 需要自己去擴(kuò)展。
但是, 擴(kuò)展的時(shí)候就有一個(gè)問題了:
Javascript 語言的Date對象每周是從星期天開始。
而Ext JS的getWeekOfYear這個(gè)方法卻又是遵循 ISO-8601, 每周是從星期一開始的。(其他的方法又有不是遵循此標(biāo)準(zhǔn)的, Ext JS混合了不同的日期時(shí)間表示標(biāo)準(zhǔn))。
Ext.Date.getWeekOfYear 這個(gè)方法的返回值是 1- 53 之間的數(shù)。
這樣的話, 就會(huì)出現(xiàn)一些問題:
Ext js 的日期顯示控件的顯示是從星期天開始: (S M T W T F S (星期天 星期一 星期二 .. 星期六))
但是, 通過選中的時(shí)間獲取星期時(shí)卻又是從星期天開始。導(dǎo)致:
1. 每個(gè)星期天的星期會(huì)小1 (比如2013/08/18 , 星期天, 應(yīng)該是34周,但是通過這個(gè)方法卻是算成上一周的結(jié)尾 , 33 周)
復(fù)制代碼 代碼如下:
date = new Date("2013/08/18");
var week = Ext.Date.getWeekOfYear(date);
alert("week="+week);
2. Ext Js 日期控件默認(rèn)顯示了 42天, 這樣的話,在兩個(gè)年交互的地方就會(huì)出現(xiàn)問題
是當(dāng)年顯示 53 周呢? 還是下一年的第一周。
解決方案
結(jié)合js 的Date 對象和 Ext js的Ext.Date, 實(shí)現(xiàn)獲取星期字串。
1. 每周以星期天為第一天
2. 每年的周數(shù)從(1-52), 如果超過52 周,算到下一年的第一周。 比如2013/12/29 為 2013年的53周, 算到 2014年的第一周
3. 返回 “W1334” 這樣的周的格式
復(fù)制代碼 代碼如下:
/*
* 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;
}
您可能感興趣的文章:
- 基于vuejs+webpack的日期選擇插件
- Ext JS框架中日期函數(shù)的用法及日期選擇控件的實(shí)現(xiàn)
- js實(shí)現(xiàn)精確到秒的日期選擇器完整實(shí)例
- js實(shí)現(xiàn)點(diǎn)擊文本框顯示日期選擇器特效代碼分享
- Ext JS 4實(shí)現(xiàn)帶week(星期)的日期選擇控件(實(shí)戰(zhàn)一)
- Js日期選擇自動(dòng)填充到輸入框(界面漂亮兼容火狐)
- Js日期選擇器并自動(dòng)加入到輸入框中示例代碼
- input 日期選擇功能的javascript代碼
- javascript 表單日期選擇效果
- 原生js實(shí)現(xiàn)日期選擇插件
相關(guān)文章
ExtJS PropertyGrid中使用Combobox選擇值問題
在PropertyGrid中使用Combobox來選擇值時(shí),得到的應(yīng)該是displayField的值,但是在確認(rèn)選擇的時(shí)候卻顯示了valueField的值2010-06-06ExtJS4中使用mixins實(shí)現(xiàn)多繼承示例
在ExtJS4中使用mixins來實(shí)現(xiàn)多繼承,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-12-12Extjs TimeField 顯示正常時(shí)間格式的代碼
由后臺返回的json的日期時(shí)間格式中,往往都是 類似 "\/Date(1309200300000)\/"的日期時(shí)間格式,結(jié)果導(dǎo)致無法正常在TimeField中顯示2011-06-06一個(gè)簡單的Ext.XTemplate的實(shí)例代碼
把省份與城市以樹的形式輸出的Ext.XTemplate的實(shí)例代碼,需要的朋友可以參考下2012-03-03extjs表格文本啟用選擇復(fù)制功能具體實(shí)現(xiàn)
extjs提供了方便的表格組件grid供使用,但是默認(rèn)情況下表格中的文本是不能被選中的,自然也是無法復(fù)制的,下面就為大家介紹下選擇復(fù)制功能如何啟用,感興趣的朋友可以了解下2013-10-10ExtJS GridPanel 根據(jù)條件改變字體顏色
ExtJS下GridPanel 根據(jù)條件改變字體顏色的實(shí)現(xiàn)代碼。2010-03-03