首页 > 解决方案 > 在 WSO2 中使用 yyyy-MM-dd 格式验证字符串日期

问题描述

我正在使用 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>

克服这个问题的最佳方法是什么?或者也欢迎任何其他替代建议。先感谢您!

标签: javascriptwso2wso2esbwso2ei

解决方案


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>

推荐阅读