Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测浏览器';输入的s格式[类型=日期]_Javascript_Html_Date_Input_Datepicker - Fatal编程技术网

Javascript 如何检测浏览器';输入的s格式[类型=日期]

Javascript 如何检测浏览器';输入的s格式[类型=日期],javascript,html,date,input,datepicker,Javascript,Html,Date,Input,Datepicker,使用Javascript,如何检测日期输入字段(input[type=date])中的日期格式 像这样的工具只能检测使用HTML5日期选择器的能力(尤其是移动设备,以及用于选择日期的用户界面)。但是,我还没有找到任何解决方案来检测浏览器使用的格式 我有这样一个输入字段: <input type="date" class="border-radius" min="2013-12-21" max="2015-12-20" data-persist-local="FromDate">

使用Javascript,如何检测日期输入字段(input[type=date])中的日期格式

像这样的工具只能检测使用HTML5日期选择器的能力(尤其是移动设备,以及用于选择日期的用户界面)。但是,我还没有找到任何解决方案来检测浏览器使用的格式

我有这样一个输入字段:

<input type="date" class="border-radius" min="2013-12-21" max="2015-12-20" data-persist-local="FromDate">

如果在localStorage中找到该值,则通过jQuery调用
.val()
输入该值。我认为,由于min和max属性的有效日期格式是有效的ISO格式,因此获取字段值将返回相同的格式。事实证明,事实并非如此

在以瑞典语为主要语言的Chrome浏览器(31.0.1650.63 m)上进行测试时,会给出ISO格式,但使用以丹麦语为主要语言的同一浏览器时,日期格式会反转为dd-mm-yyyy,而不是yyyy-mm-dd。我怀疑其他地区也是如此

我并不期待——理想情况下,会有一个函数以一致的方式获取日期,但除了显示格式之外,我还没有找到任何方法来获取任何内容

如何检测输入字段的格式,并始终转换为JS中的有效日期,然后再转换回来

理想情况下,应该有一个函数,通过一致的“有线格式”获取日期

有一个
input.valueAsDate
方法,它返回反映输入当前值的
Date
对象

根据实验(编辑:2013-12-20上的Chrome&Opera桌面版本),日期输入的显示值似乎与
new date().toLocaleDateString()
返回的格式相同,至少在Chrome中是这样

然后,在前端有3个活动日期的表示:

  • Javascript日期对象
  • 输入属性和表面值的ISO日期字符串
  • 由输入向用户表示的日期字符串
  • 要从其中任何一个获取其中任何一个: 编辑: 上述情况恰好适用于铬合金。Desktop Safari 5.1.7以ISO格式显示时间,这意味着您输入的内容就是用户看到的内容。iOS Safari以
    dd-mmm-yyyy
    格式显示一个带有缩写月份名称的下拉列表。因此,似乎没有标准

    这里有一个小功能,只为桌面Chrome和Opera提供正确的转换:

    var dateInput = ( function inputDateClosure(){
        // Type checking
        function getType( x ){
            return Object.prototype.toString.call( x );
        }
    
        function isDate( x ){
            return getType( x ) === '[object Date]';
        }
    
        function isInput( x ){
            return getType( x ) === '[object HTMLInputElement]' || '[object Object]' && Object.prototype.hasOwnProperty.call( x, 'value' );
        }
    
        function isString( x ){
            return getType( x ) === '[object String]';
        }
    
        function fromDateToValue( x ){
            return x.toISOString().substr( 0, 10 );
        }
    
        function fromDateToString( x ){
            return x.toLocaleDateString();
        }
    
        function fromInputToDate( x ){
            return x.valueAsDate;
        }
    
        function fromStringToDate( x ){
            return new Date( x.valueAsDate );
        }
    
        return function( x ){
            if( isDate( x ) ){
                return {
                    asDate   :                   x,
                    asValue  : fromDateToValue(  x ),
                    asString : fromDateToString( x )
                }
            }
            else if( isString( x ) ){
                return {
                    asDate   :                   fromStringToDate( x ),
                    asValue  : fromDateToValue(  fromStringToDate( x ) ),
                    asString : fromStringToDate( fromDateToString( x ) )
                }
            }
            else if( isInput( x ) ){
                return {
                    asDate   :                   fromInputToDate( x ),
                    asValue  : fromDateToValue(  fromInputToDate( x ) ),
                    asString : fromDateToString( fromInputToDate( x ) )
                }
            }
        }
    }() );
    

    我想我找到了一个更简单的解决办法。不确定它是否能在任何浏览器上工作,但假设javascript日期函数使用相同的本地格式,这将起作用:

     $(".date").on("change", function () {
          var selectedDate = new Date(jQuery(this).val());
    
          var selectedDateFormat = selectedDate.toLocaleDateString()
              .replace(selectedDate.getDate(), "DD")
              .replace(selectedDate.getMonth()+1, "MM")
              .replace(selectedDate.getFullYear(), "YYYY");
    
               console.log(selectedDateFormat);
     });
    
    但无论如何,在这一点上,我们可能不需要这个,因为关键是使用任何浏览器日期格式,并发送它的格式,我们希望如果我没有错。在这种情况下,我会用另一种方式来做,如下所示:

    $(".date").on("change", function () {
       var selectedDate = new Date(jQuery(this).val());
       this.setAttribute('value', 
       (selectedDate.getMonth() + 1) +
       '/' + selectedDate.getDate() +
       '/' + selectedDate.getFullYear());
    });
    

    当使用javascript获取值或使用表单提交值时,HTML5规范声称它应该始终采用RFC 3339/ISO 8601“wire format”:YYYY-MM-DD,但是它向用户显示的方式取决于浏览器,有些浏览器确实使用区域设置以用户本地日期格式显示日期。@谢谢,但我希望在不发送表单的情况下获得有效格式的值。这是针对AJAX调用的,因此值由Javascript解析并作为参数添加到调用中。回答不错,至少在读取值的部分是这样。我将进一步研究这个值,这是我以前从未见过的。谢谢@我想我可能已经解决了你的问题。检查编辑!谢谢-如果是这样的话,您会推荐什么转换方法?@Calle事实证明,这只适用于现代Chrome和Opera:Safari桌面显示ISO字符串,iOS Safari是非标准的。非常感谢您详细了解这一点。我感谢你的反馈。我将在移动设备上进行附加测试。
    $(".date").on("change", function () {
       var selectedDate = new Date(jQuery(this).val());
       this.setAttribute('value', 
       (selectedDate.getMonth() + 1) +
       '/' + selectedDate.getDate() +
       '/' + selectedDate.getFullYear());
    });