2013-12-11 119 views
5

我在我的Bootstrap應用程序中的模式窗口中使用日期選擇器。我使用Stefan Petre的原始Datepicker。我使用鼠標在桌面和移動設備上工作,並且工作正常。Bootstrap日期選擇器默認爲1900年輸入2位數年

最近我有一個用戶請求,允許它也可以使用鍵盤。我刪除了只讀屬性以允許用戶在輸入字段中輸入日期。日期格式設置爲「mm/dd/yyyy」。

當我輸入像今天這樣的日期,例如「12/11/13」,那麼它將默認爲1913.這不是一個大問題,因爲我可以訓練用戶使用4位數字,但我寧願讓它默認到本世紀。

注:這似乎只發生在日期格式與4位數年份。這似乎也發生在Stefan代碼的新叉上。

注意:我正在使用Bootstrap 2.0.4。我正在使用Firefox進行測試。

這裏是什麼樣子:

enter image description here

回答

3

這是因爲自舉日期選擇器使用JavaScript Date objects。當你創建一個新的Date對象並傳入兩位數的年份時,它將輸出1900+年份(請參閱Why does Javascript evaluate a 2-digit year of 00 as 1900 instead of 2000?

您可以嘗試調整datepicker源代碼,但這可能太複雜。

從我在http://www.eyecon.ro/bootstrap-datepicker/上可以看到的情況來看,沒有選擇爲可選日期設置範圍,但可以將格式更改爲使用兩位數年份。

在你的截圖上,我可以看到,你正在使用datepicker作爲「到達日期」,我認爲這是在將來。在網站上有一個關於如何禁用過去日期的例子。

我希望有幫助。


UPDATE

我已經寫了你的問題的事件處理程序應該做的伎倆。

的Javascript上http://jsfiddle.net/pCYbd/1/

$("#dp").datepicker(); 

$("#dp").on("keyup", function(e) { 
    var date, day, month, newYear, value, year; 
    value = e.target.value; 
    if (value.search(/(.*)\/(.*)\/(.*)/) !== -1) { 
    date = e.target.value.split("/"); 
    month = date[0]; 
    day = date[1]; 
    year = date[2]; 
    if (year === "") { 
     year = "0"; 
    } 
    if (year.length < 4) { 
     newYear = String(2000 + parseInt(year)); 
     $(this).datepicker("setValue", "" + month + "/" + day + "/" + newYear); 
     if (year === "0") { 
     year = ""; 
     } 
     return $(this).val("" + month + "/" + day + "/" + year); 
    } 
    } 
}); 

的CoffeeScript上http://jsfiddle.net/pCYbd/2/

$("#dp").datepicker() 
$("#dp").on "keyup", (e) -> 
    value = e.target.value 
    if value.search(/(.*)\/(.*)\/(.*)/) != -1 
    date = value.split("/") 
    month = date[0] 
    day = date[1] 
    year = date[2]  
    year = "0" if year == "" 
    if year.length < 4 
     newYear = String(2000 + parseInt(year)) 
     $(@).datepicker("setValue", "#{month}/#{day}/#{newYear}") 
     year = "" if year == "0" 
     $(@).val("#{month}/#{day}/#{year}") 

我的JavaScript技能是不是最好的,但這應該工作。

+0

謝謝,我很害怕這個。我需要花一整天的時間才能真正理解javascript在做什麼,所以我認爲這不值得。我打算把它打開,看看是否有人知道,如果我沒有得到任何答案,幾天後再接受它。謝謝! –

+0

我知道你可以排除過去的值,但日期選擇器仍然會進入上個世紀,即使你不能選擇任何東西。我要補充一點,如果我決定留在這個日期選擇器。 –

+0

從哪裏下載日期選擇器?實際上有兩個版本:來自http://www.eyecon.ro/bootstrap-datepicker/的Stefan Petre的原始版本和http://bootstrap-datepicker.readthedocs.org/en/latest上的分叉和改進版本/。 – cantonic

0

對我來說,最好的解決方案是直接在bootstrap-datepicker.js文件中定製parseDate函數。在一個函數裏面,有一個變量setters_map和yyyy屬性,我修改了一下。這裏是我的解決方案:

yyyy: function(d,v) { 
    if (v.toString().length == 2 && v <= 30) { 
     v = 2000 + parseInt(v); 
    } 
    return d.setUTCFullYear(v); 
}, 

在我的情況下,它需要轉換隻是不太年或等於30

0

在自舉日期選擇器的更新功能。JS我加的代碼塊:

var str = this.element.prop('value'); 
var defaulted = false; 
if (str.lastIndexOf("/") >= 0 && (str.match(/\//g) || []).length == 2) 
{ 
    var yr = str.substring(str.lastIndexOf("/") + 1); 
    if (yr.length <= 2) 
    defaulted = true; 
} 
if (this.date.getFullYear() < 2000 && defaulted) { 
    this.date.setFullYear(this.date.getFullYear() + 100); 
} 

權之前viewdate該線路設置:

this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); 
5

在JavaScript中,設定的日期選擇器的assumeNearbyYear屬性true,如T他: $("#dp").datepicker({ assumeNearbyYear: true });

+2

這可能是一個較新的功能,但它是一個完美的答案。 – Dan

1

我使用的自舉日期選擇器V1.5.1,如果你環顧四周線1741,其中它在今年的映射,你會發現這一點:

yyyy: function (d, v) { 
    return d.setUTCFullYear(v); 
}, 
yy: function (d, v) { 
    return d.setUTCFullYear(2000 + v); 
}, 

如果指定的控制使用四年的日期「yyyy」,它只會執行return d.setUTCFullYear(v);,這會讓你獲得JavaScript給你的上個世紀。當你指定它使用兩年的日期「yy」時,它會做當前世紀所需的正確的2000+。

所以,如果你想正確的2年日期是2016年,2017年等等,你需要設置你的日期選擇器使用「YY」,像這樣:

$('#tbPurchaseDate').datepicker({ 
     format: 'mm/dd/yy', 
     autoclose: true, 
     todayBtn: 'linked', 
     todayHighlight: true, 
     orientation: 'bottom auto' 
    }); 

或者你也可以改變「 yyyy「設置爲bootstrap-datepicker.js以匹配」yy「版本,但是每次通過nuget更新datepicker js文件時都必須記住這一點。只需更改格式設置就容易多了。

當然,如果你想在控件中顯示完整的4位數的年份,那麼你可能想嘗試一個在這裏列出的精心修復或只是設置「yyy」到「yy」是在js文件。

或者只是將您的代碼更新到最新版本(1.6.4現在),「yyyy」和「yy」是相同的,並且您使用assumeNearbyYear: true,如在此處的另一個答案中所述。

相關問題