当前位置: 首页 > 知识库问答 >
问题:

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

籍光熙
2023-03-14

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

像Modernizr这样的工具只检测到使用HTML5日期选择器的能力(尤其适合移动设备及其UI来选择日期)。然而,我还没有找到任何解决方案来检测浏览器使用的格式。

我有一个这样的输入字段:

<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.63m)上进行测试会给出ISO格式,但使用以丹麦语为主要语言的相同浏览器会将日期格式反转为dd-mm-yyyy而不是yyy-mm-dd。我怀疑其他语言环境也是如此。

我不想改变输入格式——理想情况下,会有一个函数通过一致的“有线格式”来获取日期,但除了显示格式之外,我还没有找到其他方法。

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

共有2个答案

鄢松
2023-03-14

我想我找到了一个更简单的解决办法。不确定它是否能在任何浏览器上工作,但假设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());
});
年风华
2023-03-14

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

有一个输入。valueAsDate方法,返回反映输入当前值的日期对象。

根据实验(编辑:使用Chrome

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

  1. Javascript日期对象
  2. 输入属性和表面值的ISO日期字符串
  3. 输入表示给用户的日期字符串
// From Javascript `Date` object to input value:
new Date().toISOString().substr( 0, 10 );

// From Javascript `Date` object to input display:
new Date().toLocaleDateString();

// From input value to Javascript `Date`:
input.valueAsDate;

// From input value to input display (step 3, then step 2):
input.valueAsDate.toLocaleDateString();

// From input display to Javascript `Date` object:
new Date( input.valueAsDate );

// From input display to input value (step 5, then step 1):
new Date( input.valueAsDate ).toISOString().substr( 0, 10 );

以上内容恰好适用于Chrome。Desktop Safari 5.1.7以ISO格式显示时间,这意味着您输入的内容就是用户看到的内容。iOS Safari显示一个带有缩写月份名称的下拉列表,格式为dd mmm yyyy。因此,似乎没有标准。

这里有一个小功能,可以为您提供正确的桌面Chrome转换

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 ) )
            }
        }
    }
}() );
 类似资料:
  • 问题内容: 我一直在寻找可以让我检测访问该网站的用户是否使用Firefox3或4的代码。我发现的所有代码都是用于检测浏览器类型而不是版本的代码。 如何检测这样的浏览器版本? 问题答案: 您可以看到浏览器说的内容,并将该信息用于记录或测试多个浏览器。

  • 我尝试使用request.meta['http_user_agent']来检测浏览器。但这将返回我测试时的浏览器类型列表 **我无法得到它返回值的模式。谁能告诉我如何得到浏览器名称

  • 问题内容: 我是angularjs的新手。如何在angularjs中检测到userAgent。可以在控制器中使用它吗?尝试了以下类似的方法,但是没有运气! 我需要专门检测IE9! 问题答案: 就像Eliran Malka询问的那样,为什么需要检查IE 9? 检测浏览器的品牌和版本通常是一种难闻的气味。通常,这意味着如果您需要JavaScript来检测特定版本的浏览器,则代码会有更大的问题。 在某些

  • 我是新的angularjs。我怎么能检测用户代理在angularjs。有可能在控制器中使用它吗?尝试了下面这样的东西,但没有运气! 我需要专门检测IE9!

  • 问题内容: 如何使用JavaScript检测Safari浏览器?我在下面尝试过代码,它不仅可以检测Safari,还可以检测Chrome浏览器。 问题答案: 您可以轻松地使用Chrome的索引来过滤掉Chrome:

  • Web Storage 是一项非常重要,并且很实用的技术,因此浏览器的支持度非常高,所有的主流浏览器,包括IE8,都在一定程度上支持Web Storage。尽管如此,最好还是像往常一样,在使用前先检测浏览器是否支持Web Storage。 在Web Storage中,可以直接使用 window 对象访问特定域下存储的数据。因此,只需检测浏览器是否支持 window.localStorage 或 w