在 WSO2 中使用 yyyy-MM-dd 格式验证字符串日期

Validate a String date with yyyy-MM-dd format in WSO2

我正在使用 wso2 MI 1.2.0。我需要验证以 yyyy-MM-dd 格式作为字符串出现的日期。 需要考虑日期的主要验证并避免以下类型的无效日期。

我尝试使用下面提到的脚本调解器。但是它在尝试调用 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>