在 WSO2 中使用 yyyy-MM-dd 格式验证字符串日期
Validate a String date with yyyy-MM-dd format in WSO2
我正在使用 wso2 MI 1.2.0。我需要验证以 yyyy-MM-dd 格式作为字符串出现的日期。
需要考虑日期的主要验证并避免以下类型的无效日期。
- 2021-02-29
- 2021-03-32
- 2021-14-03
- 2021-1r-09
- 2020-10-09t
我尝试使用下面提到的脚本调解器。但是它在尝试调用 new Date() 函数时传递了 无效日期 。
<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>
克服这个问题的最佳方法是什么?或者也欢迎任何其他替代建议。
提前致谢!
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));
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>
我正在使用 wso2 MI 1.2.0。我需要验证以 yyyy-MM-dd 格式作为字符串出现的日期。 需要考虑日期的主要验证并避免以下类型的无效日期。
- 2021-02-29
- 2021-03-32
- 2021-14-03
- 2021-1r-09
- 2020-10-09t
我尝试使用下面提到的脚本调解器。但是它在尝试调用 new Date() 函数时传递了 无效日期 。
<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>
克服这个问题的最佳方法是什么?或者也欢迎任何其他替代建议。 提前致谢!
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));
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>