[英]Validate a String date with yyyy-MM-dd format in WSO2
我正在使用 wso2 MI 1.2.0。 我需要验证以 yyyy-MM-dd 格式作为字符串出现的日期。 需要考虑日期的主要验证并避免以下类型的无效日期。
我尝试使用下面提到的脚本调解器。 但是在尝试调用new Date() function 时,它传递了无效的日期。
<script language="js"><![CDATA[var myDate = mc.getProperty("myDate");
var regEx = /^\d{4}-\d{2}-\d{2}$/;
var isMyDateValid = 'false';
if(isValidDate(myDate)) {
isMyDateValid = 'true';
}
function isValidDate(dateString) {
var log = mc.getServiceLog();
log.info("Logging inside Script Mediator"+dateString);
var regEx = /^\d{4}-\d{2}-\d{2}$/;
if(!dateString.match(regEx)) {
return false;
}
var d = new Date(dateString);
log.info("Logging inside Script Mediator d : "+d);
var dNum = d.getTime();
if(!dNum && dNum !== 0){
return false;
}
return d.toISOString().slice(0,10) === dateString;
}
mc.setProperty("isMyDateValid", isMyDateValid);]]></script>
克服这个问题的最佳方法是什么? 或者也欢迎任何其他替代建议。 先感谢您!
WSO2 Script Mediator 的问题在于它不会直接以所选语言运行脚本,而是将自身包装到 Java 中,然后尝试运行。 这就是为什么有时 JavaScript 无法按预期工作的原因。 最好在 Java 中编写代码 - 是的,你可以这样做。 对于您可以使用的验证问题,如下所示:
<script language="js"><![CDATA[
var myDate = mc.getProperty("myDate");
try {
//Java 8 uses 'uuuu' for year, not 'yyyy'. In Java 8, ‘yyyy’ means “year of era” (BC or AD).
var dateFormat = "uuuu-MM-dd";
var dtf = java.time.format.DateTimeFormatter.ofPattern(dateFormat);
java.time.LocalDate.parse(myDate, dtf.withResolverStyle(java.time.format.ResolverStyle.STRICT));
mc.setProperty("isMyDateValid", true);
} catch (error) {
mc.setProperty("isMyDateValid", false);
}
]]></script>
function validateDate(str) {
const date = new Date(str)
const isValid = !isNaN(date.getTime())
return isValid && date.toISOString().slice(0, 10) === str
}
function main() {
console.log(validateDate('2021-02-29'))
console.log(validateDate('2021-03-32'))
console.log(validateDate('2021-14-03'))
console.log(validateDate('2021-1r-09'))
console.log(validateDate('2020-10-09t'))
console.log(validateDate('2020-02-29'))
}
main()
输出:
false
false
false
false
false
true
var invalidDates = `2021-02-29 2021-03-32 2021-14-03 2021-1r-09 2020-10-09t`.split('\n'); var validDates = `2020-02-29 2021-03-31 2021-02-03 2021-11-09 2020-10-09`.split('\n'); function isValidDate(dateString) { var d = new Date(dateString); if(isFinite(d.getTime())) { const [ year, month, date ] = dateString.split("-"); return d.getFullYear() == +year && (d.getMonth() + 1) == +month && d.getDate() == +date; } return false; } console.log(invalidDates.map(isValidDate)); console.log(validDates.map(isValidDate));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.