2014-06-17 68 views
0

我需要允许日期采用以下格式:dd/mmm/yyyy此处的代码。 当我从日期选择器中选择数据时,显示的值为“dd MMM yyyy”格式。无法允许日期为dd/mmm/yyyy

但是,如果我在手动输入日期,例如,如果我输入“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> 

我可以知道我可以通过允许数据验证工作解决呢?
这里有我想要的一个例子:http://www.flyscoot.com/index.php/en/?gclid=CLvPseXn_74CFQyTjgodz5sAEQ

后,我在日期手动输入,它会自动更改为DD MMMM yyyy格式而不是从日期选择器中选择的。

+0

要将字符串更改为日期对象,您必须解析字符串,因此需要指定输入格式,以便知道如何解析它。一旦知道,解析就很简单。不要试图使用* Date.parse *,它会失败。 – RobG

+0

@RobG不好意思,但你能告诉我一个例子吗?所以对不起,因为我真的很虚弱在这.. – isg

+0

这里是一个很好的答案这个问题.http://stackoverflow.com/questions/492994/compare-dates-with-javascript –

回答

0

为了验证日期字符串,您需要指定格式是什么,以便它可以被解析。无论您编写自己的解析器还是使用其他人的解析器,都需要这样做。猜测格式不是一个好主意,因为有很多模糊的格式,有些模糊的有时却不是别人。

在这种情况下,如果你想输入作为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位数字年,所以你也应该。

您可以使用屏幕提示指定格式。不要只使用占位符,因为只要用户开始键入,占位符就会消失,因此它们不再具有所需格式的引用,除非它们删除了它们的输入,并且那些使用不支持占位符的浏览器的用户将会从来没有看到它。

+0

我不能使用'return'语句。错误:跟踪错误[line:40]实体名称必须紧跟在实体引用中的'&'后面。 但在这种情况下,我的任务是使用dd MMMM yyyy格式。因为日期选择器能够打印出dd/mm/yyyy格式。但如果我手动输入日期,它不会改变任何东西。即使我输入了奇怪的日期 – isg

+0

我有屏幕提示,这是我的日历标记中所述的水印。 – isg

+0

您问过如何将特定格式的字符串转换为日期对象,上面的答案是这样做的。将生成的日期传递给(不恰当地命名的)* CompareDates *函数,它将返回一个格式化的字符串。你如何使用你选择的日期选择器(你没有说出你正在使用哪一个)的工作取决于你。 – RobG

0

您可以使用正则表达式,以防止它匹配您的日期字符串:

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

然后你就可以判断你的字符串使用正则表达式匹配:

yourStr.match(dateReg)

+0

嗨!嗯有一个语法错误:令牌上的语法错误“无效的正则表达式选项”,没有准确的修正可用 – isg

+0

但是,这不测试有效日期。 ;-)哦,'/ s'似乎不合适。 – RobG

相关问题