Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 无法允许日期为dd/mmm/yyyy_Javascript_Date_Datepicker - Fatal编程技术网

Javascript 无法允许日期为dd/mmm/yyyy

Javascript 无法允许日期为dd/mmm/yyyy,javascript,date,datepicker,Javascript,Date,Datepicker,我需要允许日期的格式为:dd/mmm/yyyy。 当我从日期选择器中选择数据时,显示的值是dd-MMM-yyy格式 但是,如果我手动输入我想要的日期,例如,如果我输入02032014,它只是按原样读取,不会将其更改为2014年3月2日 Javascript: function CompareDates(id) { var monName = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",

我需要允许日期的格式为:dd/mmm/yyyy。 当我从日期选择器中选择数据时,显示的值是dd-MMM-yyy格式

但是,如果我手动输入我想要的日期,例如,如果我输入02032014,它只是按原样读取,不会将其更改为2014年3月2日

Javascript:

function CompareDates(id) 
{
    var monName = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sept", "Oct", "Nov", "Dec");

    var d = new Date(id);
    var curr_date = d.getDate();
    var curr_month = d.getMonth(monName);
    var curr_year = d.getFullYear();

    return d.format(curr_date + " " + curr_month + " " + curr_year);
}
和我的日历标签:

<td>
    <p:calendar 
        value="#{pc_Rpt2202.asat_date}"
        id="rp2202_input_as_at" 
        styleClass="calendar" 
        maxlength="10"
        pattern="dd MMM yyyy"
        onchange="$(this).val(CompareDates($(this).val()))"
        onfocus="$(this).mask('99/99/9999');"
    >
        <p:watermark for="rp2202_input_as_at" value="dd/MMM/yyyy" />
        <f:convertDateTime pattern="dd MMM yyyy" />
    </p:calendar>
    </td> 
我可以知道如何通过允许数据验证工作来解决这个问题吗? 下面是我想要的一个例子:


手动键入日期后,它将自动更改为dd-MMMM-yyyy格式,而不是从日期选择器中选择它。

您可以使用正则表达式来匹配日期字符串:

var dateReg=/^\d{2}[/s]+\d{2}[/s]+\d{4}$/

然后,您可以使用以下方法确定字符串是否与正则表达式匹配:


yourStr.matchdateReg

为了验证日期字符串,需要指定格式,以便对其进行解析。无论您是编写自己的解析器还是使用他人的解析器,都需要这样做。猜测格式不是一个好主意,因为有许多模棱两可的格式,有些格式有时模棱两可,但其他格式则不然

在这种情况下,如果您希望输入为ddmmyyy,我建议您使用dd/mm/yyy之类的东西,您可以解析它,创建一个日期对象,然后根据输入测试日期以检查它是否有效,例如:

// Input format ddmmyyy
function parseDMY(s) {
    var d = s.substr(0,2);
    var m = s.substr(2,2)
    var y = s.substr(4);
    var date = new Date(y, --m, d);

    // Check that date is valid, return NaN if not
    return (date && date.getFullYear() == y && date.getDate() == d)? date : NaN;
}
但是,如果使用d/m/y等格式,则更简单:

// Input format d/m/yyyy, separator can be any non-digit character (-, /, space, etc.)
// d and m can be one or two digits (e.g. 5 or 05)
function parseDMY(s) {
  var b = s.split(/\D+/);
  var d = new Date(b[2], --b[1], b[0]);
  return (d && d.getFullYear() == y && d.getDate() == d)? d : NaN;
}
请注意,上述数据将返回两位数年份的NaN,比如说1/1/05将变为1/1/1905。然而,大多数日期字段需要4位数的年份,所以您也应该这样做


您可以使用屏幕提示指定格式。不要只使用占位符,因为一旦用户开始键入,占位符就会消失,因此除非删除输入,否则他们将不再具有所需格式的引用,而使用不支持占位符的浏览器的用户将永远看不到它。

要将字符串更改为日期对象,您必须解析字符串,因此需要指定输入格式,以便知道如何解析它。一旦知道了这一点,解析就很简单了。不要试图使用Date.parse,它会失败。@RobG对不起,你能给我举个例子吗?很抱歉,因为我在这方面真的很弱。这是这个问题的一个很好的答案。@KentAnderson回答说这里有一篇关于日期的文章并不是很好的答案。似乎已经吸引了很多选票,但我想一定适合一些人。嗨!嗯,有一个语法错误:令牌上的语法错误正则表达式选项无效,没有可用的准确更正,但无法测试有效日期。;-哦,/s似乎不合适。我不能使用return语句。错误:错误跟踪[line:40]实体名称必须紧跟实体引用中的“&”。但我的任务是在本例中使用dd-MMMM-yyyy格式。因为日期选择器已经能够打印出dd/mm/yyyy格式。但是如果我手动输入日期,它不会改变任何东西。即使我输入了奇怪的日期,我也有屏幕提示,这是我日历标签上的水印。你问过如何将特定格式的字符串转换为日期对象,上面的答案就是这样的。将结果日期传递给名称不正确的CompareDates函数,它将返回格式化字符串。你如何使用你选择的日期选择器,你还没有说你正在使用哪一个取决于你。