有没有办法改变输入类型="日期"格式?

Tur*_*Ali 708 html5 date input css3

我在我的网页上使用HTML5元素.默认输入type="date"显示日期为YYYY-MM-DD.

问题是,是否可以将其格式更改为:DD-MM-YYYY

Dav*_*ots 568

改变格式是不可能的

我们必须区分有线格式和浏览器的演示格式.

线格式HTML5日期输入规范指的是RFC3339规范,它指定一个全日期格式等于:YYYY-MM-DD.有关更多详细信息,请参见RFC3339规范的5.6节.

演示文稿格式浏览器在呈现日期输入方面不受限制.在撰写Chrome时,Edge,Firefox和Opera都有日期支持(见这里).它们都显示日期选择器并在输入字段中格式化文本.

输入字段文本的格式只能在Chrome中正确完成.Edge,Firefox和Opera以正确的顺序显示语言环境的日期,月份和年份,但不一致地使用斜杠(yyyy-mm-dd),例如en-us,区域设置的日历格式需要破折号().

Internet Explorer 9,10和11显示带有线格式的文本输入字段.

  • 我认为最好写上面的完整解释:没有办法. (71认同)
  • 有趣的是,使用Chrome 20.0.1132.47 m构建时,本机日期输入中的日期显示文本已本地化.一年前它使用的是ISO 8601/RFC3339标准yyyy-MM-dd,现在我的盒子(en-US)是MM/dd/yyyy. (13认同)
  • 如果应用程序是pt_BR,我希望输入pt_BR.我的系统设置无关紧要.HTML5需要一些方法来强制执行语言环境. (9认同)
  • @AllanKimmerJensen虽然我理解你的想法.我认为使用RFC3339中指定的格式的决定是正确的,因为它不会在HTML和JavaScript之间创建耦合.关于你的第二点,我认为从可用性的角度来看,用户根据他的区域偏好来查看日历是有意义的. (7认同)
  • 这里的问题是日期分隔符似乎不遵循本地化.在我的区域日期以点分隔,即今天是05.11.2014,但是datepicker坚持显示05/11/2014,这让我的用户感到困惑 (7认同)
  • 什么是无用的组件,谁能提出这个规格? (5认同)
  • 更糟糕的是定位dd/mm/yyyy与mm/dd/yyyy如果不小心可能会变得混乱 (3认同)
  • 我使用西班牙语语言环境作为日期/货币设置,因为我在西班牙,但我的第一语言是英语,我习惯于美国键盘布局,所以我使用英语/美国键盘.我的客户是讲法语的欧洲人....我希望我能暗示Chrome等停止以美国mm-dd-yyyy格式显示日期! (3认同)
  • 现在可以从“设置”面板将显示格式设置为与 Firefox 中操作系统的区域设置相匹配,请查看我的答案以了解详细信息。Chrome 现在应该(或者可以)添加这个选项。 (2认同)

SDu*_*ude 129

由于这个问题被问到网络领域发生了很多事情,其中​​最令人兴奋的是Web组件的登陆.现在,您可以使用专为满足您的需求而设计的自定义HTML5元素来优雅地解决此问题.如果您希望覆盖/更改任何html标记的工作方式,只需构建您使用阴影dom.

好消息是已经有很多可用的样板,所以很可能你不需要从头开始提出解决方案.只需检查人们正在构建什么并从那里获取想法.

您可以从一个简单(和工作)的解决方案开始,例如聚合物的datetime-input,它允许您使用这样的标签:

 <date-input date="{{date}}" timezone="[[timezone]]"></date-input>
Run Code Online (Sandbox Code Playgroud)

或者您可以根据需要设置创意和弹出式完整日期选择器,您可以使用所需的格式和区域设置,回调以及长长的选项列表(您可以使用完整的自定义API!)

符合标准,没有黑客攻击.

仔细检查可用的polyfills,它们支持哪些浏览器/版本,以及它是否覆盖了足够的用户群%...它是2018年,所以它肯定会覆盖大多数用户.

希望能帮助到你!

  • 尽管超过 100 人显然不同意,但在我看来,这个答案并没有增加任何有用的东西。这里没有给出为什么 Web 组件(而不是为网页创建可重用小部件的任何其他方式)应该成为选择的解决方案的理由,并且至少提出的第一个组件有点垃圾(没有日历弹出窗口,如果我打错了一个太大的数字,例如日期)。此外,您实际上从未展示如何使用任何建议的组件设置自定义日期格式,这意味着最终这并不能回答所提出的问题。 (12认同)
  • 询问移动支持,你已经表明你不在乎阅读我的答案,甚至尝试研究更多.如果我知道你正在寻找一个"gimme teh codez"的答案,我不会在这里浪费我的时间.当我有时间时,我会用一个有效的网络组件更新答案,但我会为了社区. (11认同)
  • 你真是幸运.这并没有解决我的问题,或添加任何有用的信息.如果我一直关注SO,我就不会给予赏金. (5认同)
  • “自定义 HTML5 元素”链接不起作用 (3认同)

pmu*_*cha 72

如前所述,正式无法更改格式.但是,可以对字段进行样式设置,因此(通过一些JS帮助)它会以我们想要的格式显示日期.操作日期输入的一些可能性以这种方式丢失,但如果强制格式的愿望更大,则此解决方案可能是一种方式.日期字段只保留:

<input type="date" data-date="" data-date-format="DD MMMM YYYY" value="2015-08-09">
Run Code Online (Sandbox Code Playgroud)

其余的是一些CSS和JS:http://jsfiddle.net/g7mvaosL/

它非常适用于桌面版Chrome和iOS上的Safari(特别理想,因为触摸屏上的原生日期操纵器是无与伦比的恕我直言).没有检查其他人,但不要指望在任何Webkit上失败.

  • 不,他不是.你不明白它是如何工作的:你玩JS,你应该使用HTML.你已经改变了`moment`函数的输入格式,但这不是你想要的方法.您应该更改`data-date-format ="DD-YYYY-MM"`然后您将获得09-2015-08,这是正确的结果. (9认同)
  • 在 Firefox 中损坏 (6认同)
  • @SamSwift - 你改变了价值后点击了"运行"吗?;) (3认同)
  • 这不起作用,您更改为`MMMM YYYY DD`,只有`DD` 更改。-1 为此,抱歉 (2认同)
  • 在Safari,Edge,Opera中都不起作用 - 这使它无法使用 (2认同)

Joh*_*ohn 47

区分两种不同的格式很重要:

  • RFC 3339/ISO 8601"有线格式":YYYY-MM-DD.根据HTML5规范,这是在表单提交时或通过DOM API请求时必须用于输入值的格式.它是区域和区域独立的.
  • 用户界面控件显示的格式,并作为用户输入接受.建议浏览器供应商遵循用户的首选项选择.例如,在语言和文本首选项窗格中选择了"美国"区域的Mac OS上,Chrome 20使用"m/d/yy"格式.

HTML5规范不包括任何覆盖或手动指定任何格式的方法.

  • **W3C 每十年添加一次新控件**,但他们没有考虑不同的显示区域设置...我真的很想在那里工作,什么都不做就能得到报酬! (5认同)
  • “value”属性是否与有线格式匹配,或者向用户显示的内容是否匹配? (3认同)
  • @Flimm `value` 属性始终与有线格式匹配。 (2认同)

小智 17

我找到了一种更改格式的方法,这是一种棘手的方法,我只是使用 CSS 代码更改了日期输入字段的外观。

input[type="date"]::-webkit-datetime-edit, input[type="date"]::-webkit-inner-spin-button, input[type="date"]::-webkit-clear-button {
  color: #fff;
  position: relative;
}

input[type="date"]::-webkit-datetime-edit-year-field{
  position: absolute !important;
  border-left:1px solid #8c8c8c;
  padding: 2px;
  color:#000;
  left: 56px;
}

input[type="date"]::-webkit-datetime-edit-month-field{
  position: absolute !important;
  border-left:1px solid #8c8c8c;
  padding: 2px;
  color:#000;
  left: 26px;
}


input[type="date"]::-webkit-datetime-edit-day-field{
  position: absolute !important;
  color:#000;
  padding: 2px;
  left: 4px;
  
}
Run Code Online (Sandbox Code Playgroud)
<input type="date" value="2019-12-07">
Run Code Online (Sandbox Code Playgroud)

  • 它在 Firefox 浏览器中不起作用。有没有什么方法可以在 Firefox 中通过 css 处理日期格式? (5认同)

Mic*_*ior 14

我相信浏览器将使用本地日期格式.不要认为改变是可能的.您当然可以使用自定义日期选择器.

  • 取决于您使用的移动浏览器.但我怀疑这将是手机的默认设置. (2认同)
  • “本地”格式表示基于地理位置,这可能是确定日期格式的最差方法。前往欧洲旅行的美国人会期望他们的智能手机开始以24小时格式显示时间,并将日期显示为yyyy-mm-dd或dd / mm / yyyy吗?或反之亦然? (2认同)

Ali*_*ine 13

我两年前搜索过这个问题,我的谷歌搜索再次让我想到这个问题。不要浪费时间尝试用纯 JavaScript 来处理这个问题。我浪费了时间试图做到这一点dd/mm/yyyy。没有适合所有浏览器的完整解决方案。因此,我建议使用momentJS / jQuery datepicker或告诉您的客户使用默认日期格式


nor*_*can 11

经过多次跨栏后,我想出了一个允许改变格式的解决方案.有一些注意事项但如果您希望始终显示"Jan"或"01",则可以使用它.它仅适用于Windows和Mac上的Chrome,因为Firefox根本不支持原生日期选择器.

https://github.com/northamerican/custom-input-date-format

JS:

function updateDateInputs() { 
    $('input').each(function() {
        var $date = $(this),
            date = $date.val().split('-'),
            format = ['year', 'month', 'day'];
        $.each(format, function(i, v) {
            $date.attr('data-' + v, +date[i]);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

上海社会科学院:

$months: '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12';
@each $month in $months {
    $i: index($months, $month);

    input[data-month="#{$i}"][data-style="reg"]::-webkit-datetime-edit-month-field:after { 
        content: "#{$month}";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你去吧.对于读这篇文章的人来说,这个家伙的答案并没有得到足够的扩展.这是基于CSS的,并且与vanilla javascript一起使用. (4认同)
  • @我想最好的方法是将日/月设置为01或者如果按下清除则将年设置为2000.再次,这是一个概念证明,边缘代码高尔夫和我想象的Web组件,这将是一个更实际的解决方案来解决这个问题. (3认同)

小智 10

谷歌Chrome在其上一个测试版中最终使用了输入type=date,格式为DD-MM-YYYY.

因此必须有一种强制特定格式的方法.我正在开发一个HTML5网页,日期搜索现在以不同的格式失败.

  • 您提到的DD-MM-YYYY格式可能是您的本地日历格式.对于网站的访问者强制使用特定格式是不明智的(并且在我目前的HTML5标准中是不可能的),因为它们可能被用于不同于您强制使用的日历格式. (17认同)
  • 您指的是演示文稿格式,因为如果您尝试阅读input.val(),则谷歌浏览器(v35)将以yyyy-mm-dd格式返回日期,无论演示文稿格式是什么;) (3认同)
  • @DavidWalschots如果只有美国人会意识到,将弱智的mdy格式强加给世界其他地方是多么不明智的选择。 (3认同)
  • @DavidWalschoting我见过的大多数软件和操作系统都要求您“选择退出”美国的mdy格式。从这个意义上讲,它实际上是“强制的”。实际上,我的linux具有澳大利亚的所有区域设置,但是我的浏览器(如果可以将其称为美国浏览器)仍然自行显示mdy格式的所有日期,在这种情况下,我无法“选择退出”。 (2认同)

Rah*_* R. 10

浏览器从用户的系统日期格式获取日期输入格式。

\n

(在支持的浏览器、Chrome、Edge 和 Firefox 中测试。)

\n

由于目前还没有规范定义的标准来改变日期控件的样式,因此不可能在浏览器中实现相同的功能。

\n
\n

用户可以在输入[type=date] 的文本字段中键入日期值,日期格式在框中显示为灰色文本。该格式是从操作系统的设置中获取的。Web 作者无法更改日期格式,因为目前没有指定格式的标准。

\n
\n

因此,无需更改它,如果我们不更改任何内容,用户将看到日期输入的格式与他们在系统/设备设置中配置的格式相同,并且他们对此感到满意或与他们的区域设置相匹配。

\n

请记住,这只是用户在屏幕上看到的 UI 格式,在 JavaScript/后端中,您始终可以保留所需的格式来使用。

\n

更改 Windows 上的系统日期格式: \n要更改 Windows 10 或更高版本上的系统日期格式,请转至开始 --> 日期和时间设置 --> 日期、时间和区域格式 --> 更改区域格式(附图)。

\n

更改格式后,您可能需要刷新页面或有时重新启动浏览器。\n在此输入图像描述

\n

如果以上方法不起作用,您可以在 chrome 中尝试以下方法:

\n
\n

要更改 Chrome 中的格式(例如,从美国“MM/DD/YYYY”更改为\n“DD/MM/YYYY”),请转至 > 设置 > 高级 > 添加语言(选择\n英国英语)。然后:chrome 设置重新启动浏览器重新启动,您将发现如下所示的日期输入字段:\n\xc2\xb425/01/2022

\n
\n

请参阅相同的谷歌开发人员页面。

\n

WHATWG git hub 查询相同

\n

使用以下日期输入进行测试:

\n

\r\n
\r\n
<input type="date" id="dob" value=""/>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

  • 对我来说这不起作用。我的 Windows 设置格式为 dmY,但浏览器显示 m/d/Y。 (8认同)

ton*_*ton 6

如前所述,<input type=date ... >大多数浏览器都没有完全实现,所以我们来谈谈 webkit 之类的浏览器(chrome)。

使用linux,你可以通过改变环境变量来改变它LANGLC_TIME但似乎不起作用(至少对我来说)。

您可以locale在终端中键入以查看当前值。我认为同样的概念也可以应用于IOS。

例如: 使用:

LANG=en_US.UTF-8 /opt/google/chrome/chrome
Run Code Online (Sandbox Code Playgroud)

日期显示为mm/dd/yyyy

使用:

LANG=pt_BR /opt/google/chrome/chrome
Run Code Online (Sandbox Code Playgroud)

日期显示为dd/mm/yyyy

您可以使用http://lh.2xlibre.net/locale/pt_BR/pt_BR根据您的区域设置进行更改)创建您自己的自定义区域设置并根据需要设置日期格式。

关于如何更改默认系统日期的更高级参考是: https: //ccollins.wordpress.com/2009/01/06/how-to-change-date-formats-on-ubuntu/https://askubuntu。 com/questions/21316/how-can-i-customize-a-system-locale

您可以使用以下命令查看实际的当前日期格式date

$ date +%x
01-06-2015
Run Code Online (Sandbox Code Playgroud)

但 asLC_TIMEd_fmt似乎被 chrome 拒绝了(我认为这是 webkit 或 chrome 中的一个错误),遗憾的是它不起作用。:'(

所以,不幸的是,如果LANG环境变量不能解决你的问题,目前还没有办法。


ash*_*att 6

在阅读了大量讨论后,我准备了一个简单的解决方案,但我不想使用大量的 Jquery 和 CSS,只是一些 javascript。

HTML代码:

<input type="date" id="dt" onchange="mydate1();" hidden/>
<input type="text" id="ndt"  onclick="mydate();" hidden />
<input type="button" Value="Date" onclick="mydate();" />
Run Code Online (Sandbox Code Playgroud)

CSS 代码:

#dt {
  text-indent: -500px;
  height: 25px;
  width: 200px;
}
Run Code Online (Sandbox Code Playgroud)

Javascript代码:

function mydate() {
  //alert("");
  document.getElementById("dt").hidden = false;
  document.getElementById("ndt").hidden = true;
}

function mydate1() {
  d = new Date(document.getElementById("dt").value);
  dt = d.getDate();
  mn = d.getMonth();
  mn++;
  yy = d.getFullYear();
  document.getElementById("ndt").value = dt + "/" + mn + "/" + yy
  document.getElementById("ndt").hidden = false;
  document.getElementById("dt").hidden = true;
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明


Mig*_*uel 5

如果你需要一个快速的解决方案,尝试这个让yyyy-mm-dd去"dd- Sep -2016"

1)在输入附近创建一个span类(充当标签)

2)每次用户更改日期或需要从数据加载时更新标签.

适用于 IE11 +的webkit浏览器移动设备和指针事件需要jQuery和Jquery Date

$("#date_input").on("change", function () {
     $(this).css("color", "rgba(0,0,0,0)").siblings(".datepicker_label").css({ "text-align":"center", position: "absolute",left: "10px", top:"14px",width:$(this).width()}).text($(this).val().length == 0 ? "" : ($.datepicker.formatDate($(this).attr("dateformat"), new Date($(this).val()))));
        });
Run Code Online (Sandbox Code Playgroud)
#date_input{text-indent: -500px;height:25px; width:200px;}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.min.js"></script>
<input id ="date_input" dateformat="d M y" type="date"/>
<span class="datepicker_label" style="pointer-events: none;"></span>
Run Code Online (Sandbox Code Playgroud)

  • 这不回答问题,需要2个库,这些库都没有被标记或要求.它也不允许手动输入日期. (2认同)