8

我在 Bootstrap 应用程序的模式窗口中使用日期选择器。我正在使用 Stefan Petre 的原始 Datepicker。我使用鼠标在台式机和移动设备上构建它,它工作正常。

最近我有一个用户请求,允许它也可以使用键盘。我删除了只读属性以允许用户在输入字段中输入日期。日期格式设置为“mm/dd/yyyy”。

当我输入像今天这样的日期时,例如“12/11/13”,那么它将默认为 1913。这没什么大不了的,因为我可以训练用户使用 4 位数字,但我宁愿只有它默认为本世纪。

注意:这似乎只发生在 4 位数年份的日期格式中。这似乎也以同样的方式发生在 Stefan 代码的新分支中。

注意:我使用的是 Bootstrap 2.0.4。我正在使用 Firefox 进行测试。

这是它的样子:

在此处输入图像描述

4

7 回答 7

15

在 JavaScript 中,将 datepicker 的assumeNearbyYear属性设置为true,如下所示:

$("#dp").datepicker({
    assumeNearbyYear: true
});
于 2017-05-29T21:28:44.513 回答
4

发生这种情况是因为 Bootstrap 日期选择器正在使用JavaScript 日期对象。当您创建一个新的 Date 对象并传入一个两位数的年份时,它将输出 1900+年(请参阅为什么 Javascript 将 00 的两位数年份计算为 1900 而不是 2000?

您可以尝试调整 datepicker 源代码,但这可能太复杂了。

从我在http://www.eyecon.ro/bootstrap-datepicker/上看到的内容,没有设置可选日期范围的选项,但您可以更改格式以使用两位数年份。

在您的屏幕截图中,我可以看到,您正在使用“到达日期”的日期选择器,我认为这是在未来。在网站上有一个关于如何禁用过去日期的示例。

我希望这会有所帮助。


更新

我已经为您的问题编写了一个事件处理程序,它应该可以解决问题。

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

$("#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);
    }
  }
});

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

$("#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 技能不是最好的,但这应该可以。

于 2013-12-12T00:34:36.127 回答
1

如本文所示更新 bootstrap-datepicker.js 为我解决了这个问题https://github.com/eternicode/bootstrap-datepicker/pull/1461/commits/2ea16adad27cbc4d4dfa20b924addfb480e5b036

yyyy: function(d,v){                      
   if (format.parts.indexOf('yyyy') > -1 && v < 1000) v = 2000+v; // this line ***
   return d.setUTCFullYear(v);
},
于 2016-09-19T11:23:33.933 回答
1

我正在使用 bootstrap-datepicker 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+。

因此,如果您希望正确的两年日期为 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 位数年份,那么您可能想尝试此处列出的精心修复之一,或者只需将“yyyy”设置为 js 文件中的“yy”。

或者只是将您的代码更新到最新版本(现在为 1.6.4),并且“yyyy”和“yy”是相同的,您可以assumeNearbyYear: true按照此处另一个答案中的说明使用。

于 2017-08-03T15:17:57.563 回答
0

如果您在 bootstrap-datepicker.js 核心文件的 UTCDate() 中的两行以下更新,它将 100% 工作:

函数 UTCDate(){

/* 如果输入的日期年份小于 4 位,则日期默认日期为 2000*/
if(arguments!=null && arguments[0].toString().length<4) arguments[0] = 2000 + arguments[0];

     return new Date(Date.UTC.apply(Date, arguments));

}

于 2019-01-25T07:29:21.877 回答
0

在 bootstrap-datepicker.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);
于 2016-04-22T19:30:29.833 回答
0

对我来说,最好的解决方案是直接在 bootstrap-datepicker.js 文件中自定义 parseDate 函数。在函数内部,有一个带有 yyyy 属性的变量 setters_map,我对其进行了一些修改。这是我的解决方案:

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

在我的情况下,只需要转换小于或等于 30 的年份。

于 2016-04-20T08:35:55.230 回答