Есть ли способ изменить тип ввода = формат даты?

532

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

Вопрос в том, можно ли изменить его формат на что-то вроде: DD-MM-YYYY?

  • 20
    Вы должны действительно взглянуть на ваши новые ответы.
  • 0
    @SamHasler взгляните на ответы stackoverflow.com/a/32070994/800639
Показать ещё 2 комментария
Теги:
date
input

14 ответов

512
Лучший ответ

Невозможно изменить формат

Мы должны различать формат передачи и формат представления браузера.

Формат проводов Спецификация ввода даты HTML5 относится к спецификации RFC3339, которая определяет полноформатный формат, равный: yyyy-mm-dd. Более подробную информацию см. В разделе 5.6 спецификации RFC3339.

Формат представления Браузеры не ограничены тем, как они представляют ввод данных. На момент написания Chrome, Edge, Firefox и Opera была поддержка даты (см. Здесь). Все они отображают выбор даты и форматируют текст в поле ввода.

Форматирование текста поля ввода выполняется только в Chrome. Edge, Firefox и Opera отображают дату с днем, месяцем и годом в правильном порядке для локали, но непоследовательно используют косые черты (30/01/2018), где, например, ожидается, что тире (30-01-2018) формат календаря.

В Internet Explorer 9, 10 и 11 отображается текстовое поле ввода с форматом проводов.

  • 12
    Что интересно, так это то, что в Chrome 20.0.1132.47 m встроенный текст отображения даты во встроенных датах локализован. Год назад он использовал стандарт ISO 8601 / RFC3339 «гггг-мм-дд», а сейчас он «ММ / дд / гггг» на моей коробке (en-US).
  • 0
    Я изменил ответ в ответ на комментарии, приведенные выше.
Показать ещё 21 комментарий
109

Поскольку этот вопрос был задан, в веб-сфере произошло немало вещей, и одной из самых захватывающих является посадка веб-компонентов. Теперь вы можете решить эту проблему элегантно с помощью специального элемента HTML5, разработанного в соответствии с вашими потребностями. Если вы хотите переопределить/изменить работу любого тега html, просто создайте свою игру с теневым dom.

Хорошей новостью является то, что у вас уже много готового шаблона, поэтому, скорее всего, вам не придется придумывать решение с нуля. Просто проверьте, что люди строят и получают идеи оттуда.

Вы можете начать с простого (и рабочего) решения, такого как datetime-input для полимера, который позволяет использовать тег, подобный этому:

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

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

Соответствие стандартам, отсутствие хаков.

Дважды проверьте доступные полиполки, какие браузеры/версии они поддерживают, и если он покрывает достаточно% вашей пользовательской базы... Это 2018, так что, скорее всего, это наверняка охватит большинство ваших пользователей.

Надеюсь, поможет!

  • 0
    но есть ли такие локализуемые? т.е. измените названия месяцев на неанглийские. И они работают на настольных и мобильных устройствах?
  • 0
    Конечно, они локализуются. Вы можете воспользоваться преимуществами языкового стандарта системы (например, is.gd/QSkwAY ) или предоставить свои файлы i18n внутри веб-компонента (например, is.gd/Ru9U82 ). Что касается мобильных браузеров, они поддерживаются с использованием полифилов, но не на 100% (пока)… Проверьте ссылку на браузеры / версии, которую я разместил. Опять же, это кровоточит край. Если вы смотрите в будущее, это отличное решение.
Показать ещё 4 комментария
63

Как уже упоминалось ранее, официально невозможно изменить формат. Однако можно создать поле, поэтому (с небольшой помощью JS) он отображает дату в желаемом формате. Некоторые из возможностей манипулировать вводом даты теряются таким образом, но если желание форсировать формат больше, это решение может быть способом. Поля даты сохраняются только так:

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

Остальное немного CSS и JS: http://jsfiddle.net/g7mvaosL/

Он отлично работает на Chrome для рабочего стола, а Safari - на iOS (особенно желательно, поскольку собственные манипуляторы на сенсорных экранах непобедимы IMHO). Не проверял для других, но не ожидайте выхода из строя на любом Webkit.

  • 1
    Это не работает, вы меняете на MMMM YYYY DD , меняется только DD . -1 за это, извините
  • 3
    @SamSwift - нажали ли вы «Выполнить» после изменения значения? ;)
Показать ещё 11 комментариев
43

Важно различать два разных формата:

  • RFC 3339/ISO 8601 "формат провода": ГГГГ-ММ-ДД. Согласно спецификации HTML5, это формат, который должен использоваться для входного значения при отправке формы или при запросе через DOM API. Он не зависит от региона и региона.
  • Формат, отображаемый элементом управления пользовательским интерфейсом и принятый как пользовательский ввод. Поставщикам браузеров рекомендуется следить за выбором пользовательских предпочтений. Например, в Mac OS с областью "Соединенные Штаты", выбранной в области предпочтений "Язык и текст", Chrome 20 использует формат "m/d/yy".

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

  • 0
    Соответствует ли атрибут value формату проводов или что отображается пользователю?
  • 1
    @Flimm атрибут value всегда соответствует формату проводника.
13

Я считаю, что браузер будет использовать локальный формат даты. Не думайте, что это возможно. Разумеется, вы можете использовать персонализированный выбор даты.

  • 1
    локальный формат даты означает, что формат даты по умолчанию для нашего телефона или формат даты расположения?
  • 2
    Зависит от того, какой мобильный браузер вы используете. Но я подозреваю, что это будет телефон по умолчанию.
Показать ещё 1 комментарий
10

После многих препятствий я придумал решение, позволяющее изменить формат. Существует несколько предостережений, но это можно использовать, если вы хотите последовательно показывать "Янв" или "01". Он работает в Chrome на Windows и Mac только из-за того, что 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]);
        });
    });
}

SASS:

$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}";
    }
}
  • 3
    К вершине вы идете. Для людей, читающих это, этот парень просто недостаточно расширил свой ответ. Это на основе CSS и работает с ванильным JavaScript.
  • 0
    кроссбраузер вроде IE?
Показать ещё 3 комментария
9

Google Chrome в своей последней бета-версии, наконец, использует вход type=date, а формат DD-MM-YYYY.

Таким образом, должен быть способ принудительного форматирования определенного формата. Я разрабатываю веб-страницу HTML5, и теперь поиск по дате терпит неудачу с различными форматами.

  • 13
    Упомянутый вами формат ДД-ММ-ГГГГ, вероятно, является форматом вашего местного календаря. Неразумно (и, насколько я вижу, это невозможно в современных стандартах HTML5) навязывать посетителям веб-сайта определенный формат, поскольку они могут использоваться в формате календаря, отличном от того, который вы навязываете им.
  • 3
    Вы имеете в виду формат презентации, потому что если вы попытаетесь прочитать input.val (), Google Chrome (v35) вернет дату в формате гггг-мм-дд, независимо от формата презентации;)
Показать ещё 3 комментария
4

Попробуйте, если вам нужно быстрое решение. Чтобы сделать yyyy-mm-dd go "dd-Sep -2016"

1) Создайте возле вашего ввода один класс span (действуйте как метка)

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 библиотеки, ни одна из которых не помечена или не запрошена. Это также не позволяет вводить дату вручную.
  • 0
    это не было предложено изменить, только показать формат ... вы можете сделать это в качестве предварительного просмотра и использовать ввод с событиями изменения, чтобы обновить формат в любом случае.
3

Как было сказано, <input type=date ... > не полностью реализована в большинстве браузеров, поэтому позвольте говорить о webkit как браузеры (хром).

Используя 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, кажется, отклоняется хром (и я думаю, что это ошибка в webkit или хром), к сожалению он не работает.: '(

Таким образом, к сожалению, ответ, это переменная окружения IF LANG, не решает вашу проблему, еще нет способа.

  • 0
    +1 Отлично! использование: LANG=ja_JP.UTF-8 chromium-browser сделал LANG=ja_JP.UTF-8 chromium-browser дело для меня. Это также работает с Вивальди, и я думаю, в других браузерах. Спасибо!
2

После того, как я прочитал много дискуссий, я подготовил простое решение, но я не хочу использовать много 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;
}

Вывод:

Изображение 5023

1

Невозможно изменить браузер веб-кит, используя пользовательский компьютер или формат даты по умолчанию для мобильных телефонов. Но если вы можете использовать jquery и jquery ui, есть сборщик дат, который можно обозначить и может отображаться в любом формате по желанию разработчика. ссылка на jquery ui date-picker на этой странице http://jqueryui.com/datepicker/ вы можете найти демо, а также ссылку на код и документацию или документацию Если кто-то хочет получить дополнительную помощь, он/она может соединить меня в лучшей социальной сети http://www.funnenjoy.com

Изменить: -Я нахожу, что chrome использует языковые настройки, которые по умолчанию равны системным настройкам, но пользователь может их изменить, но разработчик не может заставить пользователей делать это, поэтому вам нужно использовать другие js-решения, как я говорю, вы можете искать в Интернете с помощью запрос как javascript date-pickers или jquery date-picker

0

Браузеры получают формат ввода даты с пользовательского системного формата даты.

(Протестировано в поддерживаемых браузерах, Chrome, Edge.)

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

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

Помните, что это только формат пользовательского интерфейса на экране, который видят пользователи, в вашем javascript/backend вы всегда можете сохранить желаемый формат.

Обратитесь к странице разработчиков Google.

-4

Формат выбора даты в формате HTML5 зависит от формата формата даты сервера.

Итак, вы можете изменить его, изменив формат на сервере развертывания на панели задач.

  • 6
    Нет. Обратитесь к главному ответу для объяснения формата Wire, который всегда одинаков независимо от настроек локали сервера и клиента. Это зависит только от клиента (браузера), как он будет отображаться.
-4
function dmy() {
  var mydate = document.getElementById('dat').value;
  //alert(mydate);
  var yf = mydate.split("-")[0];
  var mf = mydate.split("-")[1];
  var df = mydate.split("-")[2];

  var b = localStorage.getItem("b");
  if (!b) {
    b = [];
  } else {
    b = JSON.parse(b);

  }
  b.push({
    df: df,
    mf: mf,
    yf: yf
  });

  localStorage.setItem("b", JSON.stringify(b));
}

function showdate() {
  var sdate = JSON.parse(localStorage.getItem('b'));
  var a = '';
  if (sdate != null) {
    for (var i = 0; i < sdate.length; i++) {
      a += sdate[i]['df'] + '/' + sdate[i]['mf'] + '/' + sdate[i]['yf'] + '<br>';

    }
  } else {
    a = 'No DATA';
  }
  document.getElementById('conversion').innerHTML = a;
}
<form onsubmit=dmy()>
  <input type="date" name="dat" id="dat">
  <input type="submit" value="submit">
</form>
<input type="button" value="convert" onclick=showdate()>
<div id="conversion"></div>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню