【问题标题】:Validate a String date with yyyy-MM-dd format in WSO2在 WSO2 中使用 yyyy-MM-dd 格式验证字符串日期
【发布时间】:2021-04-09 15:54:22
【问题描述】:

我正在使用 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() 函数时,它正在传递 invalid 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>

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

【问题讨论】:

    标签: javascript wso2 wso2esb wso2ei


    【解决方案1】:

    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>
    

    【讨论】:

    • 非常感谢!!!为描述良好的答案。这完美地工作。不知道我们可以在脚本中介中使用 java 代码。再次感谢!
    【解决方案2】:
    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
    

    【讨论】:

    • 在 wso2 脚本调解器中不起作用。日期打印为“无效日期”。
    • 请提供您检查的代码或日期
    • 这是@tmoasz 提到的脚本中介的问题。无论如何,感谢您的支持。
    【解决方案3】:

    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 脚本调解器中不起作用。 d 打印为“无效日期”。
    • 即使是有效日期也打印无效日期?
    • 是的,对于任何字符串,它都会打印“无效日期”
    • 你能检查一下myDate变量中的值是什么
    • 打印正确。检查有效和无效(例如/ 2021-06-24、2021-06-32)。此外,脚本中介似乎甚至不支持 isFinite() 方法。
    猜你喜欢
    • 2017-04-07
    • 2014-01-18
    • 2022-11-29
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多