将日期输入字段的最大日期设置为今天

Jac*_*son 35 html

我只有一行简单的代码:

<input type='date' min='1899-01-01' max='2000-01-01'></input>
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将最大日期设置为"今天"而不是2000-01-01?或者我必须使用Javascript来执行此操作?

Shr*_*Pai 45

您将需要Javascript来执行此操作:

HTML

<input id="datefield" type='date' min='1899-01-01' max='2000-13-13'></input>
Run Code Online (Sandbox Code Playgroud)

JS

var today = new Date();
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
 if(dd<10){
        dd='0'+dd
    } 
    if(mm<10){
        mm='0'+mm
    } 

today = yyyy+'-'+mm+'-'+dd;
document.getElementById("datefield").setAttribute("max", today);
Run Code Online (Sandbox Code Playgroud)

JSFiddle演示

  • 完美工作..希望HTML5本身提供这种功能或更灵活的日期格式选项 (3认同)

TRi*_*iNE 30

JavaScript只是简单的解决方案

datePickerId.max = new Date().toISOString().split("T")[0];
Run Code Online (Sandbox Code Playgroud)
<input type="date" id="datePickerId" />
Run Code Online (Sandbox Code Playgroud)

  • iOS Safari 目前不支持“max”。请在此处查看此 https://caniuse.com/#search=input%20date 的更新 (4认同)
  • 显然这里是最好的 JS 解决方案 (2认同)
  • 感谢北美的热心人士:“today = new Date().toLocaleDateString('en-ca')” - 当“ISOString()”解析为 UTC 时,避免了奇怪的相差一问题 (2认同)
  • @jymbob 谢谢!这基本上对每个具有时区偏移的用户/浏览器(不仅仅是北美)都有帮助。'en-ca' 部分并没有对时区做任何事情(这是由于 `toLocaleDateString` 方法),但碰巧 'en-ca' 区域设置以输入字段需要的确切方式显示日期为 (YYY-MM-DD)。因此,对于世界上任何其他时区,您也应该使用“en-ca”作为区域设置! (2认同)
  • 我对 2021 年评论的后续:从 Chrome 110 开始,“en-ca”不再提供 ISO 友好的日期,而是返回标准的北美 m/d/y 格式。`fr-ca` 仍然是 yyyy-mm-dd (2认同)

小智 19

代替Javascript,更短的基于PHP的解决方案可能是:

 <input type="date" name="date1" max=
     <?php
         echo date('Y-m-d');
     ?>
 >
Run Code Online (Sandbox Code Playgroud)

  • @bfontaine显然您没有使用php,因为在其中html和php都是混合使用的 (3认同)
  • 您应该使用适当的模板系统,而​​不是混合HTML和PHP代码。 (2认同)
  • @Pulkit事实上你并不意味着你应该这样做. (2认同)
  • @bfontaine 混合是一个选择的问题,有些人喜欢啤酒,有些人喜欢鸡尾酒,这个例子很棒,可以用 js 或其他例子保存操作: (2认同)
  • @bfontaine 解决方案在产生另一个问题时变得糟糕,我认为这不会以任何方式导致问题,通常将 php 和 HTML 混合在同一个文件中根本不是问题。 (2认同)

小智 9

将需要Javascript; 例如:

$(function(){
    $('[type="date"]').prop('max', function(){
        return new Date().toJSON().split('T')[0];
    });
});
Run Code Online (Sandbox Code Playgroud)

JSFiddle演示

  • 并且jquery很少 (3认同)

vsy*_*ync 9

您是否不想使用外部脚本,而是max在 HTML 输入元素中设置限制,内联如下:

<input type="date" max="3000-01-01" onfocus="this.max=new Date().toISOString().split('T')[0]" />
Run Code Online (Sandbox Code Playgroud)

我故意添加了max带有遥远未来日期的属性,因为一旦max设置了属性,Chrome 浏览器似乎就会更改字段的宽度,因此为了避免这种情况,我预先设置了它。

查看现场演示

  • 我认为这是最好的解决方案,谢谢 vsync,如果有人像我一样试图阻止过去的日期,请尝试这个 ```&lt;input type="date" min="2050-01-01" onfocus="this.min =new Date().toISOString().split('T')[0]" /&gt;``` (5认同)

jaf*_*ech 7

toISOString()将给出当前的 UTC 日期。所以要获得当前的本地时间,我们必须getTimezoneOffset()从当前时间中减去它

document.getElementById('dt').max = new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000).toISOString().split("T")[0];
Run Code Online (Sandbox Code Playgroud)
<input type="date" min='1899-01-01' id="dt" />
Run Code Online (Sandbox Code Playgroud)


Str*_*bek 5

我使用 Laravel 7.x 和刀片模板,我使用:

<input ... max="{{ now()->toDateString('Y-m-d') }}">
Run Code Online (Sandbox Code Playgroud)


T J*_*T J 5

.split("T")[0]不在内存中创建字符串数组的替代方法是使用String.slice()

new Date().toISOString().slice(0, -14)
Run Code Online (Sandbox Code Playgroud)

new Date().toISOString().slice(0, -14)
Run Code Online (Sandbox Code Playgroud)
datePickerId.max = new Date().toISOString().slice(0, -14);
Run Code Online (Sandbox Code Playgroud)