Input dateと戦う
3536 ワード
万悪のinput、いつかあなたは屈服します
はじめに
input日付の種類
w 3 schoolで紹介されているように、全部で以下のようになります(いずれもHTML 5特有のタイプです).date - datetime - datetime-local - month - week - time
デフォルトのBug
資料を照会した後、モバイルブラウザの
上記のヒントに従って元の時間文字列フォーマットを
HTML 5の
前節では,移動端が
移動端取値・賦値の処理
以上、移動端における
はじめに
input
はフォーム要素の入力コントロールとして、複雑で重い役割を果たしています.テキストから数字、URL、メールアドレス、さらにラジオ、複数選択、スライドバー、さらに年月日まで、さらにはファイルを入力する機能もありますが、どのタイプも可愛くて憎いです.最近はこのtype=date
シリーズに突き刺さり、「批判」することにした.input日付の種類
w 3 schoolで紹介されているように、全部で以下のようになります(いずれもHTML 5特有のタイプです).date - datetime - datetime-local - month - week - time
デフォルトのBug
input
要素の中で日付と時間を同時に表示することをサポートするタイプはdatetime
、datetime-local
の2種類で、yyyy-MM-dd hh:mm
をフォームコントロールに割り当て、タイプdatetime
のものは完璧に表示できますが、タイプdatetime-local
は以下のように表示されます.The specified value "2018-08-09 20:54" does not conform to the required format. The format is "yyyy-MM-ddThh:mm" followed by optional ":ss" or ":ss.SSS".
datetime
ページに表示されるのは純粋なテキストボックスであり、ページに日付時間が表示されるように選択するコントロールはdatetime-local
を使用する必要がありますが、デフォルトではyyyy-MM-dd hh:mm
形式の時間はサポートされていませんので、Date
オブジェクトに変換したいと思います.PC側のブラウザではnew Date()
を直接使ってDate
のオブジェクトに変換することができますが、携帯電話側になると、記憶喪失患者のように、null
の値を必死に教えてくれます.資料を照会した後、モバイルブラウザの
Date
オブジェクトはyyyy-MM-dd hh:mm
というフォーマットをサポートしていない時間文字列であり、yyyy/MM/dd hh:mm
形式に変更する必要があることが分かった.その後、変更後に生成された値は実際の値と8時間も差があります(該当地の東八区).const date = '2018/08/09 20:54';
new Date(date); // PC 2018/08/09 20:54
new Date(date); // mobile 2018/08/09 12:54
上記のヒントに従って元の時間文字列フォーマットを
yyyy-MM-ddThh:mm
に変換してみると、input
要素にデフォルト値を正しく追加することができます.HTML 5の
new Date
のタイムゾーン前節では,移動端が
yyyy/MM/dd hh:mm
のフォーマットを用いてDate
のオブジェクトをインスタンス化すると,生成された時間が直接0タイムゾーンに表示され,探索を続けるうちにインスタンス化されたDate
オブジェクトがgetHours
関数を呼び出したときに得られた時間数がまた現地タイムゾーンを経て変換されていることが分かった.したがって,移動端におけるDate
オブジェクトが生成した時間を文字列に変換する際にデフォルトでタイムゾーンを持たず,時間オブジェクト自体の値に問題はないと大まかに結論できる.それから、お父さんのことが来ました.ページで時間選択にdatetime-local
を使用すると、現在では正常に値が付与されている(yyyy-MM-ddThh:mm
形式を使用することを前提としている)が、当然のことながら、時間選択後もyyyy-MM-ddThh:mm
形式の時間文字列(依然として0タイムゾーン)が返され、この値がDate
オブジェクトに変換され、戻り値は予想より8時間も大きく、問題はありません.結局、表示されている値は0タイムゾーンで、東8タイムに戻るのは8時間プラスですが、問題はPC側が変換した値が正しいので、どちらかが妥協しなければなりません.間違いなく、選択はあなたです.モバイル端末です.移動端取値・賦値の処理
以上、移動端における
input
元素datetime-local
のタイプのピットを理解することができ、次に解決策である.まず、デフォルト値を付与する際に、取得したタイムスタンプをyyyy-MM-ddTmm:hh
形式の文字列に変換します(toISOString
メソッドは使用できません.このメソッドは0タイムゾーンの値を返し、字面的には8時間も少なく見えます).そして時間を選択した後、フォームを提出する際に取得したyyyy-MM-ddTmm:hh
形式の時間文字列をT
に置き換えて :
date.replace('T', ' ');
PC input
とする.
HTML 5は まで してきたが、input
の タイプにはまだ の がある.
ブログの ドアを します.https://blog.paddings.cn/2018/07/24/html/input-date/