input type =“ date”形式を変更する方法はありますか?


766

私のWebページでHTML5要素を使用しています。デフォルトでは、入力type="date"は日付をとして示しますYYYY-MM-DD

問題は、その形式を次のように変更できるDD-MM-YYYYかどうかです。


4
GoogleはChromeに関するFAQを作成しました:developer.google.com/web/updates/2012/08/…したがって、形式はOSのロケール設定に基づいています。
Endy Tjahjono、2015年

私はそれを作るために私の時間を無駄にし dd/mm/yyyyます。モーメントやjQuery datepickerなどの別のライブラリを使用するだけ
Ali Al Amine

回答:


608

フォーマットを変更することは不可能です

オーバーザワイヤ形式とブラウザのプレゼンテーション形式を区別する必要があります。

ワイヤーフォーマット

HTML5日付入力仕様が指すRFC 3339の仕様に等しいフル日付形式を指定し、: yyyy-mm-dd。詳細については、RFC 3339仕様のセクション5.6を参照してください。

このフォーマットは、valueHTML属性とDOMプロパティによって使用され、通常のフォーム送信を行うときに使用されるフォーマットです。

プレゼンテーション形式

ブラウザは、日付入力の表示方法に制限はありません。執筆時点では、Chrome、Edge、Firefox、およびOperaは日付をサポートしています(ここを参照)。それらはすべて日付ピッカーを表示し、入力フィールドのテキストをフォーマットします。

デスクトップデバイス

Chrome、Firefox、およびOperaの場合、入力フィールドのテキストのフォーマットは、ブラウザーの言語設定に基づいています。Edgeの場合は、Windowsの言語設定に基づいています。悲しいことに、すべてのWebブラウザーは、オペレーティングシステムで構成された日付形式を無視します。私にはこれは非常に奇妙な振る舞いであり、この入力タイプを使用するときに考慮すべきことです。たとえば、慣れている形式ではなく、オペレーティングシステムまたはブラウザの言語が設定されているオランダのユーザーen-usが表示さ01/30/2019れます30-01-2019

Internet Explorer 9、10、および11は、ワイヤー形式のテキスト入力フィールドを表示します。

モバイルデバイス

特にChrome on Androidの場合、フォーマットはAndroidの表示言語に基づいています。私はこれを確認することができませんでしたが、同じことが他のブラウザにも当てはまると思います。


私は、ワイヤーフォーマットではなく、JSタイムスタンプを望んでいました。プレゼンテーション形式を変更する方法として、一貫性を持たせるのはかなり困難です。
アランキマージェンセン

7
@AllanKimmerJensenはあなたの考えを理解しています。RFC3339で指定されたフォーマットを使用する決定は、HTMLとJavaScriptの間の結合を作成しないため、正しいものであると私は思います。2番目の点については、ユーザビリティの観点から、ユーザーが地域の好みに従ってカレンダーを表示することは理にかなっていると思います。
David Walschots 2013年

10
アプリがpt_BRの場合、pt_BR入力が必要です。私のシステム設定は関係ありません。HTML5にはロケールを適用する方法が必要です。
iurisilvio 2015年

5
私はスペインを拠点としているため、日付/通貨の設定にスペイン語のロケールを使用していますが、最初の言語は英語で、米国のキーボードレイアウトに慣れているため、英語/米国のキーボードを使用します。私の顧客はフランス語を話すヨーロッパ人です...私はアメリカのmm-dd-yyyy形式で日付を表示するのをやめるようにChromeなどにヒントが欲しいです!
ルークH

6
一体何がこの仕様を思いついたのでしょうか?
2016年

144

この質問が出されて以来、Webの分野ではかなり多くのことが起こりました。最も刺激的なことの1つは、Webコンポーネントのランディングです。これで、ニーズに合うように設計されたカスタムHTML5要素でこの問題をエレガントに解決できます。htmlタグの動作をオーバーライド/変更したい場合は、シャドウdomを使用してビルドしてください。

良い知らせは、利用可能な定型文がすでにたくさんあるので、最初からソリューションを考え出す必要がないということです。ただ、チェックの人々が構築しているか、そこからアイデアを得ます。

あなたはこのようなタグを使用することを可能にするポリマーのdatetime-inputのようなシンプルな(そして実用的な)ソリューションから始めることができます:

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

または、希望するフォーマットとロケール、コールバック、およびオプションの長いリストを使用して、クリエイティブでポップアップの完全な日付ピッカーのスタイルを希望どおりに設定できます(完全なカスタムAPIを自由に使用できます!)

標準に準拠し、ハッキングはありません。

利用可能なポリフィル、それらがサポートするブラウザー/バージョン、およびユーザーベースの十分な%をカバーしているかどうかを確認してください。それは2018年なので、ほとんどのユーザーを確実にカバーする可能性があります。

それが役に立てば幸い!


しかし、ローカライズ可能なものはありますか?つまり、月の名前を英語以外に変更します。そして、それらはデスクトップとモバイルで動作しますか?
サムハスラー2015

もちろん、それらはローカライズ可能です。あなたは、システムのロケールの利点を取ることができる(すなわち:is.gd/QSkwAY)またはwebcomponentの内側にあなたの国際化ファイルを提供する(すなわち:is.gd/Ru9U82)。モバイルブラウザーについては、ポリフィルを使用してサポートされていますが(100%はまだ)ではありません…私が投稿したブラウザー/バージョンのリンクを確認してください。繰り返しますが、これは最先端です。あなたが将来を見据えているなら、それは素晴らしい解決策です。
joseldn 2015

申し訳ありませんが、私はあなたの最新のコメントを見ていませんでした。これ:jcrowther.io/2015/05/11/i18n-and-web-componentsは非常に便利に見え、答えに含める必要があります。
Sam Hasler、2015

お役に立ててうれしいです。答えをすべて更新します。
joseldn 2015

@SDude含める価値があるとあなたが示したリンクがまだ含まれていないようです。
マークアメリー

79

前述のとおり、形式を変更することは公式には不可能です。ただし、フィールドのスタイルを設定することは可能であるため、(少しのJSヘルプを使用して)希望する形式で日付を表示します。日付入力を操作する可能性の一部はこの方法で失われますが、フォーマットを強制したいという願望がより大きい場合は、この解決策が1つの方法である可能性があります。日付フィールドはそのままです。

<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とiOSのSafariでうまく動作します(タッチスクリーンのネイティブ日付マニピュレーターは無敵のIMHOであるため、特に望ましいです)。他をチェックしませんでしたが、Webkitで失敗することはありません。


1
これは機能せず、に変更するMMMM YYYY DDと、DD変更のみが行われます。このため-1、申し訳ありません
Can O 'スパム

3
@SamSwift-値を変更した後に「実行」をクリックしましたか?;)
pmucha 2015

9
いいえ、そうではありません。あなたはそれがどのように機能するかを理解していません:あなたはJSで遊んで、あなたはHTMLですべきです。moment関数の入力フォーマットを変更しましたが、それは進むべき道ではありません。変更する必要がdata-date-format="DD-YYYY-MM"あり、その後、正しい結果である09-2015-08を取得します。
pmucha 2016年

3
Safari、Edge、Operaでは機能せず、使用できません
MaxZoom

2
Firefoxでの
不具合

51

2つの異なる形式を区別することが重要です。

  • RFC 3339 / ISO 8601「ワイヤー形式」:YYYY-MM-DD。HTML5仕様によれば、これはフォームの送信時またはDOM API経由で要求されたときに入力の値に使用する必要がある形式です。ロケールと地域に依存しません。
  • ユーザーインターフェイスコントロールによって表示され、ユーザー入力として受け入れられる形式。ブラウザベンダーは、ユーザーの設定の選択に従うことをお勧めします。たとえば、言語とテキストの設定ペインで地域「米国」が選択されているMac OSでは、Chrome 20は「m / d / yy」の形式を使用します。

HTML5仕様には、どちらの形式もオーバーライドまたは手動で指定する手段は含まれていません。


1
value属性はワイヤー形式と一致しますか、それともユーザーに何が表示されますか?
Flimm 2017

2
@Flimm value属性は常にワイヤー形式と一致します。
David Walschots

14

ブラウザはローカルの日付形式を使用すると思います。変更できるとは思わないでください。もちろん、カスタムの日付ピッカーを使用することもできます。


1
ローカル日付形式とは、電話のデフォルトの日付形式または場所の日付形式を意味しますか?
Govindarao Kondala、2011年

2
使用しているモバイルブラウザによって異なります。しかし、私はそれが電話のデフォルトになると思います。
Michael Mior

2
「ローカル」形式とは、地理的な場所に基づくことを意味します。これは、おそらく日付形式を決定するための最も悪い方法です。ヨーロッパに旅行しているアメリカ人は、スマートフォンが24時間形式で日付を表示し始め、日付がyyyy-mm-ddまたはdd / mm / yyyyとして表示されることを期待しますか?それともアメリカのヨーロッパ人にとっては逆ですか?
RobG 2016年

10

最後のベータ版のGoogle Chromeは最終的に入力を使用しtype=date、形式はDD-MM-YYYYです。

したがって、特定のフォーマットを強制する方法が必要です。HTML5 Webページを開発していますが、日付検索がさまざまな形式で失敗します。


18
あなたが言及するDD-MM-YYYY形式は、おそらくローカルカレンダー形式です。Webサイトの訪問者に特定の形式を強制することは賢明ではありません(私が見る限りでは現在のHTML5標準では不可能です)。強制的に使用するものとは異なるカレンダー形式に使用される可能性があるためです。
David Walschots

3
あなたは(input.valを読みしようとした場合ので、あなたは(V35)クロムグーグル、)、プレゼンテーション形式に言及されているプレゼンテーション形式が何であれ、YYYY-MM-DD形式で日付を返します。)
チルト

3
@DavidWalschotsは、アメリカ人だけが世界の他の地域で遅延MDY形式を強制することがいかに賢明でないかを理解するだろう。
user275801 2018

@ user275801私は同意しますM-D-Yが、これは奇妙な形式です。アメリカ人がそれを他人に押し付けるのを見たことがありません。:-)
デビッドウォルショッツ2018

2
@DavidWalschots私が見たほとんどのソフトウェアとオペレーティングシステムでは、アメリカのmdy形式を「オプトアウト」する必要があります。その意味で、それは実際には「強制」されています。実際、私のLinuxにはオーストラリアのすべての地域設定がありますが、私のブラウザー(アメリカのブラウザー、それと呼べる場合)は、すべての日付をmdy形式で表示します。この場合、「身を引く"。
user275801 2018年

5

簡単な解決策が必要場合は、これを試してください。yyyy-mm-ddを「dd- Sep -2016」にするには

1)入力の近くに1つのスパンクラスを作成します(ラベルとして機能)

2)日付がユーザーによって変更されるたびに、またはデータからロードする必要があるときに、ラベルを更新します。

Webkitブラウザーモバイルで動作し、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 2016年

変更するように求められたのではなく、形式を表示するだけです...これをプレビューとして実行し、変更イベントで入力を使用して、とにかく形式を更新できます。
2016年

4

たくさんの議論を読んだ後、私は簡単な解決策を用意しましたが、たくさんのJqueryとCSSを使いたくありません。

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 ... >はほとんどのブラウザーで完全に実装されていないので、ブラウザー(クロム)のようなWebキットについて話しましょう。

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環境変数が問題を解決しない場合、応答はまだありません。


+1すごい!使用:LANG=ja_JP.UTF-8 chromium-browser私のためにトリックをしました。また、Vivaldiでも動作し、他のブラウザでも動作します。ありがとう!
lepe 2015

2

ブラウザは、ユーザーのシステム日付形式から日付入力形式を取得します。

(サポートされているブラウザー、Chrome、Edgeでテストされています。)

現在のところ、日付コントロールのスタイルを変更するための仕様で定義されている標準はないため、ブラウザに同じものを実装することはできません。

ただし、システム設定から日付形式を取得するこの振る舞いの方が優れており、オーバーライドしないでください。その理由は、ユーザーがシステム/デバイスで構成したものと同じ日付入力の形式を表示し、ロケールに慣れている、またはロケールと一致しているためです。

これは、ユーザーに表示される画面上のUIフォーマットにすぎないことを覚えておいてください。javascript/バックエンドでは、いつでも希望のフォーマットを維持できます。

同じ上でグーグル開発者のページを参照してください。


@downvoters、現在および将来の回答を改善するために、-1についてコメントを残すことをお勧めします。
Rahul R.

2

ユーザーのコンピューターまたは携帯電話のデフォルトの日付形式を使用するWebキットブラウザーを変更することはできません。ただし、jqueryとjquery UIを使用できる場合は、設計可能な日付ピッカーがあり、開発者が望む任意の形式で表示できます。jquery UIの日付ピッカーへのリンクは、このページhttp://jqueryui.com/datepicker/にあります。デモ、コード、ドキュメント、またはドキュメントリンクを見つけることができます。

編集:-私はChromeがデフォルトでシステム設定と同じ言語設定を使用していることを見つけましたが、ユーザーはそれらを変更できますが、開発者はユーザーにそうするように強制することができないため、Webを検索できると他のjsソリューションを使用する必要がありますjavascript date-pickersまたはjquery date-pickerなどのクエリ


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()を使用して)入力フィールドに必要な形式に従って文字列に配列を結合します

これはすべて1行で行われます。

これは誰かに役立つと思ったので、これを書いた。


これは、尋ねられた質問には対応していません。あなたはしている解析することをフォーマット変更していない、ここでカスタムフォーマットを<input>用途に値を表示するが。
マークアメリー

これは回避
策です

0

2年前にこの問題を検索しましたが、グーグル検索で再びこの質問が表示されます。純粋なJavaScriptでこれを処理しようとする時間を無駄にしないでください。私はそれを作るために私の時間を無駄にしdd/mm/yyyyます。すべてのブラウザーに適合する完全なソリューションはありません。そのため、jQuery datepickerを使用するか、代わりにデフォルトの日付形式を使用するようにクライアントに指示することをお勧めします


-1

私はそれが古い投稿であることを知っていますが、それはグーグル検索の最初の提案、短い回答はありません、推奨回答はカスタム日付ピッカーです、私が使用する正しい答えはテキストボックスを使用して日付入力をシミュレートし、必要な形式を実行します、ここにコードがあります

<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-このコードをページの複数の日付入力に使用する場合は、関数呼び出しと入力自体の両方でテキスト入力のID「xTime」を別のものに変更し、もちろん、必要な入力の名前を使用してくださいフォーム送信。

4番目の関数では、day + "/" + month + "/" + yearたとえば例year + "/" + month + "/" + dayの代わりに任意のフォーマットを使用でき、テキスト入力でプレースホルダーまたは値を次のように使用しますページの読み込み時のユーザーのyyyy / mm / dd。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.