jquery crontab to 한글
Programming/JavaScript
2019. 3. 20. 10:50
반응형
TMS, PUSH 등을 주기적으로 전송하는 시스템을 위해 만든 크론탭 생성 스크립트.
크론탭을 모르는 일반 관리자들을 위해,. DB 저장시엔 crontab 양식으로, 화면에 노출되는 방식은 한글로 처리 하기 위해
주기적으로 전송건이마, 전송 기한이 정해여 있기 때문에 크론탭 형식으로 등록하고 관리.
<!doctype html>
<html lang="en">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
<!--
$(document).ready(function() {
translateCrontab();
itemChange(); // 주기 세팅
// 발송주기 세팅 start
for ( var i=0 ; i < 24 ; i ++)
{
// 분
if(i<6)
$('#cycle_mm').append($("<option>"+(i==0?"0":"")+( i*10) +"</option>"));
// 시각
$('#cycle_tt').append( $("<option>"+(i<10?"0":"")+i +"</option>"));
}
// 발송주기 세팅 end
});
/**
* 발송 주기 변환 * crontab -> 설명
* 발송주기를 사용하는 ellement 에 class 선언 필수 class ='regulary_cycle'
* @author edward 2019-03-21
* @return 발송주기 한글
* Spring Quartz crontab 형식을 한글로 변환한다.
* >> 1: 초(0~59) , 2: 분(0~59) , 3: 시(0~23) , 4 : 일 ( 1~ 31 ) , 5 : 월 (1~12) , 6: 요일 ( 0~6 ) , 7:년도(생략 )
? : 조건없음 [일, 요일 에서만 사용가능]
* : 모든 조건에서 참
L : [일, 요일 에서만 사용가능]
- 일에서 사용하면 : 예(L) 마지막 날짜입니다. 예를들어 1월이라면 31일 2월이라면 윤년에 따라 28혹은 29일 4월이라면 30일에 참.
- 요일에서 사용하면 : 예(6L) 6은(토요일) 마지막 토요일에 실행됩니다. 마지막주가 토요일이 없다면 그전주 토요일에 참.\
W : [일에서만 사용가능]
- 가장 가까운 평일(월~토)를 찾습니다.
- 15W 라고 설정했다면 15일이 월~금 범위라면 해당 날짜에서 참.
- 15W 15일이 토요일이라면 가장 가까운 금요일인 14일에 참.
- 15W 15일이 일요일이라면 가장 가까운 월요일인 16일에 참.
# : [요일에서만 사용가능]
- 예를들어 3#2 라고 썻다면 (수요일#2번째주)라는 의미가 됩니다.
- 즉 2번째주의 수요일에 참이 됩니다.
*/
function translateCrontab()
{
var arrList = $(".regulary_cycle"); // 발송주기를 사용하는 ellement 에 class 선언
var cronrtabExp ;
var crontabStr ;
$.each(arrList, function(index, item)
{
// 0: 초(0~59) , 1: 분(0~59) , 2: 시(0~23) , 3 : 일 ( 1~ 31 ) , 4 : 월 (1~12) , 5: 요일 ( 0~6 )
cronrtabExp = $(this).text().split(" ");
crontabStr = '';
// 특정 요일
if(cronrtabExp[5] !="*")
{
switch(cronrtabExp[5])// 6: 요일 ( 0~6 )
{
case '0' : crontabStr = "일" ; break;
case '1' : crontabStr = "월" ; break;
case '2' : crontabStr = "화" ; break;
case '3' : crontabStr = "수" ; break;
case '4' : crontabStr = "목" ; break;
case '5' : crontabStr = "금" ; break;
case '6' : crontabStr = "토" ; break;
}
crontabStr = "매주 "+ crontabStr+"요일 ";
}
else
{
if(cronrtabExp[3] !="*"){// 특정 일
crontabStr = "매월 "+ cronrtabExp[3]+"일 ";
} else{ // 전체 일
crontabStr = "매일 ";
}
}
crontabStr = crontabStr + cronrtabExp[2] + " 시 ";// 3: 시(0~23)
crontabStr = crontabStr + cronrtabExp[1] + " 분"; // 2: 분(0~59)
// crontabStr = crontabStr + cronrtabExp[0] + " 초" // 1: 초(0~59) parseInt
//crontabStr = " [ "+ $(this).text() + " ] "+crontabStr ;
$(this).text(crontabStr);
});
}
function itemChange()
{
var cycleDD = ["1일","2일","3일","4일","5일","6일","7일","8일","9일","10일"
,"11일","12일","13일","14일","15일","16일","17일","18일","19일","20일"
,"21일","22일","23일","24일","25일","26일","27일","28일","29일","30일","31일"]; // 매월
var cycleW = ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"]; // 매주
var selectItem = $("#cycle_1").val();
$('#cycle_2').empty();
if(selectItem == "매일") {
$('#cycle_2').hide();
}else{
$('#cycle_2').show();
var changeItem;
if(selectItem == "매월") changeItem = cycleDD;
else if(selectItem == "매주") changeItem = cycleW;
for (var j in changeItem) {
var option = $("<option>"+changeItem[j]+"</option>");
$('#cycle_2').append(option);
}
}
} // en itemChange
//-->
</script>
</head>
<body>
<!-- crontab to 한글 주기 설명 변환 -->
0 40 3 * * 2 : <span class="regulary_cycle">0 40 3 * * 2</span></br>
0 20 3 * * * : <span class="regulary_cycle">0 20 3 * * *</span></br>
0 0 4 19 * * : <span class="regulary_cycle">0 0 4 19 * *</span></br>
0 0 1 * * 1 : <span class="regulary_cycle">0 0 1 * * 1</span></br>
<!-- 주기 선택에 따른 선택 사항 자동 변경 -->
<select id="cycle_1" onchange="itemChange()" style="width:60px;">
<option>매월</option>
<option>매주</option>
<option>매일</option>
</select> <!-- 월/주/일 -->
<select id="cycle_2" style="width:60px;"> </select> <!-- 일자/요일 -->
<select id="cycle_tt" style="width:40px;"> </select>시 <!-- 시간 -->
<select id="cycle_mm" style="width:40px;"> </select>분 <!-- 분 -->
</body>
</html>
JAVA 단에서는 실행주기에 따른 다음 실행일(getCronTabData)을 등록하였다.
public String getCurrentDate(String format) {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
long now = System.currentTimeMillis();
return dateFormat.format(new Date(now));
}
public int getDayOfWeek(String dateStr) {
// dateStr = "2020-07-12";
dateStr = dateStr.replace("-","");
Calendar calendar = Calendar.getInstance();
int year = Integer.parseInt(dateStr.substring(0,4));
int month = Integer.parseInt(dateStr.substring(4,6)) -1 ; // 입력월.
int day = Integer.parseInt(dateStr.substring(6)) ; // -1;
System.out.println( "year : "+year + " / month : "+month +" / day : "+day );
calendar.set(year, month, day);
int o_lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println( "o_lastDay : "+o_lastDay );
return calendar.get(Calendar.DAY_OF_WEEK); // 1(일) ~7(토)
}
// 날짜 더하기
//
// @param dt(날짜) , y(년) , m(월), d(일)
// @Exam addDate("2019-03-21",1,6,1) -> 2020-09-22
// @return String
//
public String addDate(String dt, int y, int m, int d) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
Date date = format.parse(dt);
cal.setTime(date);
cal.add(Calendar.YEAR, y); //년 더하기
cal.add(Calendar.MONTH, m); //월 더하기
cal.add(Calendar.DATE, d); // 더하기
return format.format(cal.getTime());
}
//이번주 해당요일의 날자를 구함 .
// @author edward
// @param dateStr
// @return
//
public String getCurrentWeekDate(String dateStr, int dayofWeek ) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
Date date = format.parse(dateStr);
cal.setTime(date);
cal.set(Calendar.DAY_OF_WEEK, dayofWeek); // 일요일 (1) ~ 토요일(7)
return format.format(cal.getTime());
}
public String getCronTabData(Map<String,Object> params) {
String nextSendDate = this.getCurrentDate("yyyy-MM-dd"); // yyyyMMdd 오늘 날자 이후로 cycle에 맞게 등록.
String cycle_1 = String.valueOf(params.get("cycle_1")); // 매월, 매주,매일
String cycle_2 = String.valueOf(params.get("cycle_2")); // 매월 (1일 ~ 31일) , 매주 (일요일 ~ 토요일) , 매일 (없음)
int cycle_tt = Integer.valueOf(String.valueOf(params.get("cycle_tt"))); // 시간 : 00 ~ 23
int cycle_mm = Integer.valueOf(String.valueOf(params.get("cycle_mm"))); // 분 : 00 ~ 50 10분단위
int todayDayOfWeek = this.getDayOfWeek(nextSendDate.replace("-", "")) ;// 오늘날자의 요일 가져오기 // 1 (일) ~ 7 (토)
/*
* PUSH_CYCLE ( 발송주기)은 Spring Quartz crontab 형식으로 저장한다.
>> 1: 초(0~59) , 2: 분(0~59) , 3: 시(0~23) , 4 : 일 ( 1~ 31 ) , 5 : 월 (1~12) , 6: 요일 ( 0~6 ) , 7:년도(생략 )
초 분 시 일 월 요일 년도(생략)
0 0 3 * * * 매일 3시
0 30 0/1 * * * 매 시각 30분
0 0 18 * * 3 매주 수요일 6시
*/
StringBuffer pushCycle = new StringBuffer("0"); //초
pushCycle.append(" ").append(cycle_mm); // 분
pushCycle.append(" ").append(cycle_tt); // 시
if(cycle_1.equals("매월")) {
// 다음 실행일 세팅 : 등록한 날자가 오늘보다 같거나 작은 경우 다음주에 실행
int todayDD = Integer.parseInt(nextSendDate.substring(8));
int cycleDD = Integer.parseInt(cycle_2.replace("일", ""));
if(todayDD >= cycleDD ) {;
nextSendDate = this.addDate(nextSendDate,0,1,0) ;
}
pushCycle.append(" ").append(cycleDD); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" *"); // 요일
}else if(cycle_1.equals("매주")) {
pushCycle.append(" *"); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" "); // 요일
String dayOfWeek = cycle_2.substring(0,1); // dow : Days Of The Week
int cycleDayOfWeek =0;
if(dayOfWeek.equals("일")) cycleDayOfWeek = 1; //pushCycle.append(0);
else if(dayOfWeek.equals("월")) cycleDayOfWeek = 2; //pushCycle.append(1);
else if(dayOfWeek.equals("화")) cycleDayOfWeek = 3; //pushCycle.append(2);
else if(dayOfWeek.equals("수")) cycleDayOfWeek = 4; //pushCycle.append(3);
else if(dayOfWeek.equals("목")) cycleDayOfWeek = 5; //pushCycle.append(4);
else if(dayOfWeek.equals("금")) cycleDayOfWeek = 6; //pushCycle.append(5);
else if(dayOfWeek.equals("토")) cycleDayOfWeek = 7; //pushCycle.append(6);
else return "푸시 등록에 실패 하였습니다 관리자에게 문의하여 주십시오.";
pushCycle.append(--cycleDayOfWeek); // 요일 일(0) ~ 토(6)
// 다음 실행일 세팅 : 등록한 요일 정보가 오늘보다 같거나 작은 경우 다음주에 실행
nextSendDate = this.getCurrentWeekDate(nextSendDate, cycleDayOfWeek ); // 이번주 주기를 세팅한다. // 일요일 (1) ~ 토요일(7)
if( todayDayOfWeek >= cycleDayOfWeek) {
// addDate( 기준일자,년,월,일) ;
nextSendDate = this.addDate(nextSendDate,0,0,7) ;
}
}else if(cycle_1.equals("매일")) {
pushCycle.append(" *"); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" *"); // 요일
}else {
return "푸시 등록에 실패 하였습니다 관리자에게 문의하여 주십시오.";
}
return pushCycle.toString(); // 발송 주기
}
반응형