无法选择公元前年份

Posted

技术标签:

【中文标题】无法选择公元前年份【英文标题】:Cannot select years BC 【发布时间】:2013-12-28 19:03:31 【问题描述】:

我正在处理一个需要处理 BC 日期(例如 100BC 或 2000BC)以及 2014AC 等的项目。

在 Datepicker 的 API 文档中,声明 minDatemaxDate 可以使用 javascript Date 对象设置(在 1970 的任一侧都有 aprox 285,616 的最小值和最大值) .

似乎不可能在 BC 甚至 99 年 1 月 1 日之前设置年份。

$("#date").datepicker(
    dateFormat: 'dd-mm-yy',
    showButtonPanel: true,
    changeMonth: true,
    changeYear: true,
    yearRange: '0:2010',
    inline: true );

我怎样才能超过这个限制?

【问题讨论】:

您是否尝试设置 minDate 和 maxDate 然后相应地更新 yearRange? 如果您将 yearRange 中的第一年设置为足够远的时间,这似乎很好:jsfiddle.net/j08691/wLUpU @j08691 即使在您的示例中,也无法选择日期 1/2/70 例如。另外,请注意在您设置的年份范围内 -3000 并且下拉菜单显示 -987。这里显然有一个问题。更不用说,如果您保持下拉列表不变,它会选择 2013 作为日期(选择日期,然后单击编辑并再次选择,而不使用年份下拉列表..哎呀!) 可能重复:***.com/questions/1122989/… 查看这个答案:***.com/questions/25846123/… 【参考方案1】:

您需要自己实现一个新的日期选择器。 09/04/1752 不存在。

http://www.genealogytoday.com/columns/everyday/030902.html

尝试在 jquery 网站上的日期选择器中输入该日期。

http://jqueryui.com/datepicker/

干杯。

【讨论】:

您应该提供一些证据说明为什么不可能(正如您所暗示的那样)。另外,我并不真正关心这个特定的日期,但感谢您指出这一点。有趣的故事 我做到了。第一个链接清楚地解释了“不列颠群岛和包括美国在内的所有英国殖民地损失了 11 天——9 月 3 日到 13 日”。也许您会很幸运地找到另一个可以解决此问题的日历。祝你好运。显然 jQuery Datepicker 没有考虑到这一点,因此在此之前的任何日期都将被取消。如果您在 unix 终端上键入“cal 1752”,您可以看到 cal 程序解决了这个问题。这可能是一个开始的地方 我没有解决您不关心这个日期的其他问题。我认为您应该这样做,因为在此之前的所有日期都将至少休息 11 天。因此,您的工作日名称将不匹配。如果您不需要这些,那就不用担心。 我还应该补充一点,您的位置可能会有所作为。 “虽然这些天在 1752 年在英国土地上消失了,但在其他地方,一些数字已经消失了——1582 年的法国、1584 年的奥地利和 1700 年的挪威。”【参考方案2】:

我认为根本问题是数学/逻辑错误。最初,当年份下拉出现时,它显示19,当前为2019 年份。切换到1492,一切都好。切换到666,一切都好。切换到121,一切都好。切换到 99……呃,现在是 1999 年。

你可以在这里测试一下:

$(function() 
  $("#datepicker").datepicker(
    dateFormat: 'dd/mm/yy',
    showButtonPanel: true,
    changeMonth: true,
    changeYear: true,
    yearRange: 'c-22019:c+1',
    inline: true
  );
);
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<p>Date: <input type="text" id="datepicker"></p>

如果您尝试回到公元 100 年以下的任何事物,例如 -1 或公元前 1 年,这会导致问题。

看起来构建年份下拉列表的逻辑需要一些帮助。您可以在 BC 选择一个日期,但很难从该范围内到达那里。需要研究一下,稍后再更新。

更新

我正在查看yearRange,其逻辑与使用的逻辑不同。要获得理想的结果,最好使用当前年份格式c-nn:c+nn

$(function() 
  $("#datepicker").datepicker(
    dateFormat: 'dd/mm/yy',
    showButtonPanel: true,
    changeMonth: true,
    changeYear: true,
    yearRange: '-2000:2020',
    inline: true
  );
  
  var oldD = new Date();
  oldD.setYear(-1);
  
  $("#datepicker").datepicker("option", "defaultDate", oldD);
);
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<p>Date: <input type="text" id="datepicker"></p>

仍然存在099 的问题,我认为这与Date 相关,假设并添加19,当它传递一年时。我认为这可以通过使用 Date 对象来解决,但在 jQuery UI 代码的这一部分中没有这样做:

    // Year selection
    if ( !inst.yearshtml ) 
        inst.yearshtml = "";
        if ( secondary || !changeYear ) 
            html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
         else 

            // determine range of years to display
            years = this._get( inst, "yearRange" ).split( ":" );
            thisYear = new Date().getFullYear();
            determineYear = function( value ) 
                var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
                    ( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
                    parseInt( value, 10 ) ) );
                return ( isNaN( year ) ? thisYear : year );
            ;
            year = determineYear( years[ 0 ] );
            endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
            year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
            endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
            inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
            for ( ; year <= endYear; year++ ) 
                inst.yearshtml += "<option value='" + year + "'" +
                    ( year === drawYear ? " selected='selected'" : "" ) +
                    ">" + year + "</option>";
            
            inst.yearshtml += "</select>";

            html += inst.yearshtml;
            inst.yearshtml = null;
        
    

【讨论】:

【参考方案3】:

您将无法使用 B.C.无论如何,我们目前的日历,因为他们使用儒略历。尝试将我们的日期转换为 Julian,看看它是否有效。

【讨论】:

以上是关于无法选择公元前年份的主要内容,如果未能解决你的问题,请参考以下文章

正则表达

记录兼容IE8中发现的一些问题

js只能选择年份的代码

Datepicker 的动态年份范围

在 Android 日历视图中首先显示年份选择

bootstrap datepicker只选择年份