Чи є спосіб змінити тип введення = формат «дата»?


766

Я працюю з елементами HTML5 на своїй веб-сторінці. За замовчуванням введення type="date"показує дату як YYYY-MM-DD.

Питання в тому, чи можна змінити його формат на щось на зразок DD-MM-YYYY:?


4
Google створив FAQ для Chrome: developers.google.com/web/updates/2012/08/… Формат базується на налаштуваннях локальної локальної системи.
Endy Tjahjono

Я марную свій час, намагаючись це зробити dd/mm/yyyy. просто використовуйте іншу бібліотеку, як момент або jQuery datepicker
Алі Аль Амін

Відповіді:


608

Змінити формат неможливо

Ми маємо розмежовувати формат за допомогою дроту та формат презентації браузера.

Формат дроту

Введення специфікація дати HTML5 , відноситься до специфікації RFC 3339 , який визначає формат повної дати , рівний: yyyy-mm-dd. Докладніше див. Розділ 5.6 специфікації RFC 3339.

Цей формат використовується valueатрибутом HTML та властивістю DOM і використовується тим, хто виконує звичайну подачу форми.

Формат презентації

Веб-переглядачі не обмежують те, як вони представляють введення дати. На час написання Chrome, Edge, Firefox та Opera підтримували дату (див. Тут ). Всі вони відображають інструмент вибору дати та форматують текст у полі введення.

Настільні пристрої

Для Chrome, Firefox та Opera форматування тексту поля введення ґрунтується на мовній настройці браузера. Для Edge він базується на налаштуваннях мови Windows. На жаль, всі веб-браузери ігнорують форматування дати, налаштоване в операційній системі. Для мене це дуже дивна поведінка, і що потрібно враховувати при використанні цього типу введення. Наприклад, голландські користувачі , які мають свою операційну систему або набір мов браузера en-usбуде відображатися 01/30/2019замість формату вони звикли до: 30-01-2019.

Internet Explorer 9, 10 і 11 відображає поле для введення тексту у форматі дроту.

Мобільні пристрої

Спеціально для Chrome на Android форматування базується на мові відображення Android. Я підозрюю, що це стосується інших браузерів, хоча я не зміг це перевірити.


Я б сподівався на часову позначку JS, а не на провідну форму. І спосіб зміни формату презентації досить важко зробити послідовним.
Аллан Кіммер Дженсен

7
@AllanKimmerJensen, хоча я розумію твої думки. Я вважаю, що рішення про використання формату, визначеного в RFC3339, є правильним, оскільки воно не створює зв'язку між HTML і JavaScript. Щодо вашого другого пункту, я вважаю, що з точки зору зручності користування, користувачеві було б сенс бачити календар відповідно до його регіональних уподобань.
David Walschots

10
Якщо додаток pt_BR, я очікую введення pt_BR. мої налаштування системи не мають значення. HTML5 потрібен певний спосіб примусової локалізації.
iurisilvio

5
Я використовую іспанську мову для налаштування дати / валюти, оскільки я базуюсь в Іспанії, але моя перша мова - англійська, і я звик до розкладки клавіатури США, тому я використовую англійську / США клавіатуру. Мої клієнти є франкомовними європейцями .... Я б хотів, щоб я натякнув Chrome і т.д., щоб перестати показувати дати у форматі США mm-dd-yyyy!
Лука H

6
який марний компонент, хто чорт придумав ці характеристики?
бог

143

Оскільки це запитання було задано, у веб-царині трапилося досить багато речей, і однією з найбільш хвилюючих є посадка веб-компонентів . Тепер ви можете вирішити це питання елегантно за допомогою спеціального елемента HTML5, розробленого відповідно до ваших потреб. Якщо ви хочете змінити / змінити роботу будь-якого html-тегу, просто побудуйте свою гру, граючи з тіньовим домом .

Хороша новина полягає в тому, що вже є багато котлоагрегатів, тому, швидше за все, вам не потрібно буде придумувати рішення з нуля. Просто перевірте, що люди будують, і отримайте ідеї звідти.

Ви можете почати з простого (і працюючого) рішення, як -от введення дати для полімеру, що дозволяє використовувати тег, як цей:

 <date-input date="{{date}}" timezone="[[timezone]]"></date-input>

або ви можете отримати креативні та спливаючі вікна вибору дат, оформлених за вашим бажанням , із форматуванням та місцеположенням, за яким ви хочете, зворотними дзвінками та довгим списком опцій (у вас у розпорядженні цілий спеціальний API!)

Відповідність стандартам, жодних злому.

Двічі перевірте доступні поліфайли , які браузери / версії вони підтримують, і якщо він охоплює достатньо% вашої бази користувачів… Це 2018 рік, тож шанси на те, що він, безумовно, охопить більшість ваших користувачів.

Сподіваюся, це допомагає!


але чи є хтось із цих локалізованих? тобто змінити назви місяців на неанглійські. А чи працюють вони на настільних та мобільних пристроях?
Сем Хаслер

Звичайно, вони локалізовані. Ви можете скористатися локальною системою (тобто: is.gd/QSkwAY ) або надати свої файли i18n всередині веб-компонента (тобто: is.gd/Ru9U82 ). Що стосується мобільних браузерів, вони підтримуються за допомогою поліфілів, хоча ще не на 100% (поки що)… Перевірте посилання браузерів / версій, які я розмістила. Знову ж таки, це кров’янисті краї. Якщо ви дивитесь вперед, це чудове рішення.
joseldn

Вибачте, я не бачив вашого останнього коментаря. Це: jcrowther.io/2015/05/11/i18n-and-web-components виглядає цілком корисним і його слід включити у відповідь.
Сем Хаслер

Радий, що ви вважаєте його корисним. Відповідь я все оновлю.
joseldn

@SDude Схоже, посилання, які ви вказали, що вважаєте за варті, включати, як і раніше не включаються.
Марк Амерді

79

Як було сказано раніше, формально змінити формат офіційно неможливо. Однак можна стилізувати поле, тому (за допомогою невеликої допомоги JS) він відображає дату у потрібному нам форматі. Деякі можливості маніпулювати введенням дат втрачаються таким чином, але якщо бажання форсувати формат більше, це рішення може бути способом. Поля дати залишається лише таким:

<input type="date" data-date="" data-date-format="DD MMMM YYYY" value="2015-08-09">

Решта - це трохи CSS та JS: http://jsfiddle.net/g7mvaosL/

$("input").on("change", function() {
    this.setAttribute(
        "data-date",
        moment(this.value, "YYYY-MM-DD")
        .format( this.getAttribute("data-date-format") )
    )
}).trigger("change")
input {
    position: relative;
    width: 150px; height: 20px;
    color: white;
}

input:before {
    position: absolute;
    top: 3px; left: 3px;
    content: attr(data-date);
    display: inline-block;
    color: black;
}

input::-webkit-datetime-edit, input::-webkit-inner-spin-button, input::-webkit-clear-button {
    display: none;
}

input::-webkit-calendar-picker-indicator {
    position: absolute;
    top: 3px;
    right: 0;
    color: black;
    opacity: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<input type="date" data-date="" data-date-format="DD MMMM YYYY" value="2015-08-09">

Це чудово працює на Chrome для настільних ПК та Safari на iOS (особливо бажано, оскільки рідні маніпулятори дати на сенсорних екранах є неперевершеним IMHO). Не перевіряв інших, але не сподівайся, що не вдасться на жодному веб-сайті.


1
Це не працює, це ви змінюєте MMMM YYYY DD, лише DDзміни. -1 за це, вибачте
Can O 'Spam

3
@SamSwift - чи змінили ви значення, натиснувши "Виконати"? ;)
pmucha

9
Ні, він ні. Ви не розумієте, як це працює: Ви граєте з JS і вам слід з HTML. Ви змінили формат введення momentфункції, і це не шлях. Ви повинні були змінитися, data-date-format="DD-YYYY-MM"і тоді ви отримаєте 09-2015-08, що є правильним результатом.
pmucha

3
Не працює ні в Safari, Edge, Opera, які роблять його непридатним для використання
MaxZoom

2
Зламаний у Firefox
Олександр Лальє

51

Важливо розрізняти два різні формати :

  • RFC 3339 / ISO 8601 "провідний формат": РРРР-ММ-DD. Відповідно до специфікації HTML5, це формат, який повинен бути використаний для значення введення при поданні форми або при запиті через API DOM. Він не залежить від місцевості та регіону.
  • Формат, відображений управлінням інтерфейсу користувача та прийнятий як введення користувача. Продавців браузерів рекомендується дотримуватися вибору налаштувань користувача. Наприклад, у Mac OS з регіоном "Сполучені Штати", обраним на панелі "Налаштування мови та тексту", Chrome 20 використовує формат "m / d / yy".

Специфікація HTML5 не включає жодних засобів переопределення або вручну вказівки будь-якого формату.


1
Чи відповідає valueатрибут формату дроту або що відображається користувачеві?
Flimm

2
@Flimm valueатрибут завжди відповідає формату дроту.
Девід Уолшотс

14

Я вірю, що браузер використовуватиме локальний формат дати. Не думайте, що це можливо змінити. Звичайно, ви можете використовувати спеціальний інструмент вибору дати.


1
локальний формат дати означає наш формат дати за замовчуванням або формат дати про місцеположення?
Говіндарао Кондала

2
Залежить від мобільного браузера, який ви використовуєте. Але я підозрюю, що це буде дефолт телефону.
Майкл Міор

2
"Локальний" формат означає на основі географічного розташування, що, можливо, є найгіршим способом визначення формату дати. Чи очікує американець, який подорожує Європою, очікує, що їхній смартфон почне показувати час у 24-годинному форматі та дати, як рр-р-мм-дд, або дд / мм / рр.? Або навпаки для європейця в США?
RobG

10

Google Chrome в останній бета-версії, нарешті, використовує вхід type=date, і формат є DD-MM-YYYY.

Тому повинен бути спосіб примусити певний формат. Я розробляю веб-сторінку HTML5, а пошуки дат зараз не вдаються в різних форматах.


18
Формат DD-MM-YYYY, який ви згадуєте, - це, ймовірно, ваш місцевий формат календаря. Нерозумно (і наскільки я бачу, неможливо в рамках чинних стандартів HTML5) застосовувати певний формат для відвідувачів веб-сайту, оскільки вони можуть використовуватися у форматі календаря, відмінному від того, на який ви їх застосовуєте.
Девід Уолшотс

3
Ви посилаєтесь на формат презентації, оскільки якщо ви спробуєте прочитати input.val (), google chrome (v35) повертає дату у форматі yyyy-mm-dd, незалежно від формату презентації;)
Tilt

3
@DavidWalschots, якби тільки американці зрозуміли, як нерозумно форсувати відсталий формат mdy в іншому світі.
user275801

@ user275801 Хоча я згоден, M-D-Yце незвичайний формат. Я не бачив, як американці примушували його до інших. :-)
Девід Уолшотс

2
@DavidWalschots більшість програм і операційних систем, які я бачив, вимагає від вас "відмовитися" від американського формату mdy. У цьому сенсі це насправді "вимушено". Насправді мій Linux має всі регіональні налаштування для Австралії, але мій браузер (американський браузер, якщо це можна так назвати) все ще бере на себе, щоб відображати всі дати у форматі mdy, і в цьому випадку я не в змозі " відмовитися".
user275801

5

Спробуйте це, якщо вам потрібно швидке рішення, щоб змусити yyyy-mm-dd перейти на "dd- вересень -2016"

1) Створіть біля вхідного класу один проміжний клас (виконайте функцію мітки)

2) Оновлюйте мітку щоразу, коли ваша дата змінюється користувачем або коли потрібно завантажувати дані.

Працює для мобільних телефонів браузера і подій вказівника для IE11 +, потрібні 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()))));
        });
#date_input{text-indent: -500px;height:25px; width:200px;}
<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>


2
Це не відповідає на запитання, і для цього потрібні 2 бібліотеки, жодна з яких не позначена тегами чи запитами. Він також не дозволяє вводити дату вручну.
RobG

його не просили змінювати, лише показувати формат ... Ви можете це зробити як попередній перегляд, а також використовувати введення з подіями зміни, щоб оновити формат все одно.
Мігель

4

Прочитавши багато дискусій, я підготував просте рішення, але я не хочу використовувати багато 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();" />

CSS-код:

#dt {
  text-indent: -500px;
  height: 25px;
  width: 200px;
}

Код 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;
}

Вихід:

введіть тут опис зображення


3

Як було сказано, цей механізм <input type=date ... >не повністю реалізований у більшості браузерів, тому поговоримо про такі веб-перегляди, як браузери (chrome).

Використовуючи linux, ви можете змінити його, змінивши змінну середовища LANG, LC_TIMEале, здається, не працює (принаймні для мене).

Ви можете ввести localeтермінал, щоб побачити поточні значення. Я думаю, що та сама концепція може бути застосована і до IOS.

наприклад: Використання:

LANG=en_US.UTF-8 /opt/google/chrome/chrome

Дата показана як mm/dd/yyyy

Використання:

LANG=pt_BR /opt/google/chrome/chrome

Дата показана як 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

Але як LC_TIMEі, d_fmtсхоже, його відкидає хром (і я думаю, що це помилка в веб-програмі чи хромі), на жаль, це не працює . : '(

Тож, на жаль, відповідь, якщо LANGзмінна середовище не вирішує вашу проблему, поки немає способу.


+1 Чудово! використовуючи: LANG=ja_JP.UTF-8 chromium-browserзробив для мене трюк. Він також працює з Вівальді, і я думаю, що і в інших браузерах. Дякую!
lepe

2

Браузери отримують формат введення дати з формату системної дати користувача.

(Тестується в підтримуваних браузерах, Chrome, Edge.)

Оскільки в даний час не існує жодного стандарту, визначеного специфікаціями для зміни стилю управління датою, його неможливо реалізувати в браузерах.

Однак така поведінка отримання формату дати з системних налаштувань краща, і я настійно пропоную, ми не повинні намагатися її перекрити. Причина полягає в тому, що користувачі побачать формат введення дати такий же, як вони були налаштовані в системі / пристрої, і який їм комфортний, або збігається зі своєю локальною точкою.

Пам'ятайте, що це лише формат користувальницького інтерфейсу на екрані, який бачать користувачі, у вашому javascript / бекенді ви завжди можете зберігати бажаний формат.

Перегляньте сторінку розробників google на одній і тій же.


@downvoters, краще залишити коментар про -1, щоб покращити поточні та майбутні відповіді.
Рахул Р.

2

Неможливо змінити веб-набори браузерів, використовуючи комп'ютер або мобільний формат дати за замовчуванням. Але якщо ви можете використовувати користувальницький інтерфейс jquery та jquery, існує програма вибору дати, яка може бути визначена і може бути показана у будь-якому форматі, як хоче розробник. посилання на інструмент вибору дати інтерфейсу jquery знаходиться на цій сторінці http://jqueryui.com/datepicker/ ви можете знайти демонстраційну версію, а також код та документацію чи документацію.

Редагувати: -Я вважаю, що chrome використовує мовні налаштування, які за замовчуванням дорівнюють системним налаштуванням, але користувач може їх змінити, але розробник не може змусити користувачів робити це, тому вам доведеться використовувати інші рішення js, як я кажу, ви можете шукати в Інтернеті із запитами, такими як інструменти вибору дати JavaScript або вибір дати jquery


2

Я знайшов спосіб змінити формат, його хитрий спосіб, я просто змінив зовнішній вигляд полів введення дати, використовуючи лише 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;
  
}
<input type="date" value="2019-12-07">


0

Оскільки публікація активна 2 місяці тому. тому я подумав також дати свій внесок.

У моєму випадку я отримую дату від зчитувача карт, який постачається у форматі dd / mm / yyyy.

що я роблю. Напр

var d="16/09/2019" // date received from card
function filldate(){
    document.getElementById('cardexpirydate').value=d.split('/').reverse().join("-");
    }
<input type="date" id="cardexpirydate">
<br /><br />
<input type="button" value="fill the date" onclick="filldate();">

що робить код:

  1. він розбиває дату, яку я отримую як dd / mm / yyyy (використовуючи split ()) на основі "/" і складає масив,
  2. Потім він оберне масив (використовуючи reverse ()), оскільки введення дати підтримує зворотний обмін того, що я отримую.
  3. потім він приєднується (використовуючи join ()) масив до рядка відповідно до формату, необхідного для поля введення

Все це робиться в один рядок.

Я думав, що це допоможе комусь, тому я написав це.


Це не стосується заданого питання; Ви тут розбираєте нестандартний формат, не змінюючи формат, який <input>використовує для показу значення.
Марк Амерді

це лише робота навколо
Хезбулла Шах»

0

Я шукав цю проблему 2 роки тому, і мій пошук в Google знову призводить мене до цього питання. Не витрачайте час, намагаючись впоратися з цим за допомогою чистого JavaScript. Я марную свій час, намагаючись це зробити dd/mm/yyyy. Не існує повного рішення, яке б відповідало всім браузерам. Тому я рекомендую використовувати дату jQuery вибору або сказати вашому клієнту працювати з типовим форматом дати


-1

Я знаю, що це стара публікація, але вона приходить як перша пропозиція в пошуку Google, коротка відповідь ні, рекомендована відповідь користувачеві користувальницький пікер дати, правильна відповідь, яку я використовую, використовує текстове поле для імітації введення дати та будь-якого формату, який ви хочете , ось код

<html>
<body>
date : 
<span style="position: relative;display: inline-block;border: 1px solid #a9a9a9;height: 24px;width: 500px">
    <input type="date" class="xDateContainer" onchange="setCorrect(this,'xTime');" style="position: absolute; opacity: 0.0;height: 100%;width: 100%;"><input type="text" id="xTime" name="xTime" value="dd / mm / yyyy" style="border: none;height: 90%;" tabindex="-1"><span style="display: inline-block;width: 20px;z-index: 2;float: right;padding-top: 3px;" tabindex="-1">&#9660;</span>
</span>
<script language="javascript">
var matchEnterdDate=0;
//function to set back date opacity for non supported browsers
    window.onload =function(){
        var input = document.createElement('input');
        input.setAttribute('type','date');
        input.setAttribute('value', 'some text'); 
        if(input.value === "some text"){
            allDates = document.getElementsByClassName("xDateContainer");
            matchEnterdDate=1;
            for (var i = 0; i < allDates.length; i++) {
                allDates[i].style.opacity = "1";
            } 
        }
    }
//function to convert enterd date to any format
function setCorrect(xObj,xTraget){
    var date = new Date(xObj.value);
    var month = date.getMonth();
    var day = date.getDate();
    var year = date.getFullYear();
    if(month!='NaN'){
        document.getElementById(xTraget).value=day+" / "+month+" / "+year;
    }else{
        if(matchEnterdDate==1){document.getElementById(xTraget).value=xObj.value;}
    }
}
   </script>
  </body>
</html>

1- зверніть увагу, що цей метод працює лише для браузера, який підтримує тип дати.

2 - перша функція в коді JS призначена для браузера, який не підтримує тип дати та встановить вигляд на звичайне введення тексту.

3- якщо ви будете використовувати цей код для введення кількох дат на своїй сторінці, будь ласка, змініть ідентифікатор "xTime" тексту введення як у виклику функції, так і вхід сам на щось інше, і, звичайно, використовуйте ім'я вводу, який ви хочете для подати форму.

4-друга функція, ви можете використовувати будь-який потрібний вам формат замість дня + "/" + місяць + "/" + рік, наприклад, рік + "/" + місяць + "/" + день, а при введенні тексту використовуйте заповнювач або значення як yyyy / mm / dd для користувача при завантаженні сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.