JavaScript 日期格式与cron表达式的互相转换

需求:将日期格式转成Java的cron表达式传给后台,回显时候将Java的cron表达式反解析成日期格式

首先,了解一些Java的cron表达式:(可参考https://www.jianshu.com/p/e9ce1a7e1ed1对cron表达式的详解)


举例说明

"0 15 10 * * ? *" 每天上午10:15触发

"0 15 10 * * ? 2005" 2005年的每天上午10:15触发

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

"0 15 10 L * ?" 每月最后一日的上午10:15触发

"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

wloopValue  :[{id: '2', name: '星期一'}, {id: '3', name: '星期二'}, {id: '4', name: '星期三'}, {id: '5', name: '星期四'}, {id: '6', name: '星期五'}, {id: '7', name: '星期六'}, {id: '1', name: '星期日'}]

mloopValue :[1,2,3,...31]

解析成cron表达式:

 // 循环条件转成cron表达式 (基于vue)
      dateChangeCron (dates) { //dates 为传进来的整个日期类型的对象 effectTime:yyyy-MM-d:h为执行时间点
        let m = ''
        let s = ''
        let h = ''
        let w = dates.wloopValue || ''
        let mo = dates.mloopValue || ''
        if (dates.effectTime) {
          h = dates.effectTime.getHours()
          m = dates.effectTime.getMinutes()
          s = dates.effectTime.getSeconds()
        }
        let loopType = dates.loopType
         //loopType :[{value: 'ONE_TIME', label: '单次执行'},
	//  {value: 'DAILY', label: '按天循环'},
	 // {value: 'WEEKLY', label: '按周循环'},
	 // {value: 'MONTHLY', label: '按月循环'}]
        var cron = ''
        if (loopType === 'DAILY') {
          cron = s + ' ' + m + ' ' + h + ' * * ? *'
        } else if (loopType === 'WEEKLY') { // 星期天为1,星期6为7
          cron = s + ' ' + m + ' ' + h + ' * * ' + w.join(',') + ' *'
        } else if (loopType === 'MONTHLY') { // 1-31
          cron = s + ' ' + m + ' ' + h + ' ' + mo.join(',') + ' * ? *'
        }
        return cron 
       //  console.log(cron)      19 30 16 * * 2,3 *
      }
反解析cron表达式:
 // cron表达式转成循环条件
      // cron 为空的为单次循环
      // 29 29 16 * * ? * 按天
      // 19 30 16 * * 2,3 * 按周
      // 44 30 16 2,4,21 * ? * 按月
      // 提取特殊字符串长度(scrstr 源字符串 armstr 特殊字符)
      cronChangeDate (str) {
        var toDate = {}
        if (!str) {
          toDate.loopType = '单次循环'
        } else {
          var result = str.split(' ').join('')
          var nArr = str.split(' ')
          var countData = this.getPlaceholderCount(result)
          if (!countData.count1) { // 没有'?'则是按周循环
            toDate.loopType = '周循环'
            var keys = nArr[5]
            var en2cnMap = {
              1: '周天',
              2: '周一',
              3: '周二',
              4: '周三',
              5: '周四',
              6: '周五',
              7: '周六'
            }
            var cnKeys = keys.split(',').map(function (key, idx) {
              return en2cnMap[key];
            })
            toDate.loopValue = cnKeys.join(',')
          } else if (countData.count1 + countData.count2 === 3) {
            toDate.loopType = '月循环'
            var mot = []
            var mkeys = nArr[3].split(',')
            for (var i = 0; i < mkeys.length; i++) {
              let mo = mkeys[i] + '号'
              mot.push(mo)
            }
            toDate.loopValue = mot.join(',')
          } else {
            toDate.loopType = '天循环'
          }
          toDate.loopTime = nArr[2] + ':' + nArr[1] + ':' + nArr[0]
        }

    return toDate

// console.log(toDate)  {loopType: "月循环", loopValue: "2号,4号,21号", loopTime: "16:30:44"}

      },
      // 统计字符串中包含某个字符的个数
      getPlaceholderCount (strSource) {
        var count1 = 0 // ?的个数
        var count2 = 0 // *的个数
        strSource.replace(/\*|\?/g, function (m, i) {
          if (m === '?') {
            count1++
          } else if (m === '*') {
            count2++
          }
        });
        var obj = {}
        obj.count1 = count1
        obj.count2 = count2
        return obj //返回一个对象,根据需要得到想要的值
      }


  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于Java中的日期Cron表达式的互转,你可以使用`java.util.Date`和`org.quartz.CronExpression`类来实现。 要将Cron表达式转换日期,你可以按照以下步骤进行操作: 1. 创建一个`CronExpression`对象,将Cron表达式作为参数传递给它的构造函数。 2. 使用`getNextValidTimeAfter()`方法获取下一个有效的日期时间。这将返回一个`java.util.Date`对象,表示Cron表达式下一个执行时间点。 下面是一个示例代码: ```java import org.quartz.CronExpression; import java.text.ParseException; import java.util.Date; public class CronDateConverter { public static void main(String[] args) { String cronExpression = "0 0 12 * * ?"; // 例子:每天中午12点 try { CronExpression cron = new CronExpression(cronExpression); Date nextExecutionDate = cron.getNextValidTimeAfter(new Date()); System.out.println("下一个执行时间:" + nextExecutionDate); } catch (ParseException e) { e.printStackTrace(); } } } ``` 要将日期转换Cron表达式,你可以按照以下步骤进行操作: 1. 创建一个`CronExpression`对象,使用构造函数创建一个空的Cron表达式。 2. 使用`setStartTime()`方法设置起始时间,使用`setEndTime()`方法设置结束时间。这些时间将被用于计算出Cron表达式。 3. 使用`getCronExpression()`方法获取计算出的Cron表达式。 下面是一个示例代码: ```java import org.quartz.CronExpression; import java.text.ParseException; import java.util.Date; public class DateCronConverter { public static void main(String[] args) { Date startDate = new Date(); // 当前时间 Date endDate = new Date(System.currentTimeMillis() + 3600000); // 当前时间1小时后 try { CronExpression cron = new CronExpression(null); // 创建空的Cron表达式对象 cron.setStartTime(startDate); cron.setEndTime(endDate); String cronExpression = cron.getCronExpression(); System.out.println("计算出的Cron表达式:" + cronExpression); } catch (ParseException e) { e.printStackTrace(); } } } ``` 注意:上述示例中使用的是`org.quartz.CronExpression`类来处理Cron表达式。你需要添加`quartz`依赖才能使用该类。在Maven项目中,你可以在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 这样就可以在Java中实现日期Cron表达式的互转了。希望对你有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值