IT정리노트

블로그 이미지

Edward. K

메멘토적 기억능력을 소유한 개발자 노트.

jquery crontab to 한글

Programming/JavaScript 2019. 3. 20. 10:50
반응형

crontab_to_infoStr.html
다운로드

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();  // 발송 주기 	
	}
반응형
Posted by Edward. K
블로그 이미지

메멘토적 기억능력을 소유한 개발자 노트.

by Edward. K

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

  • eclipse plugin
  • STS
  • 컴퓨터 관리
  • EditPlus
  • flex
  • Graphic
  • egov
  • tomcat
  • 미네르바
  • netbeans
  • 캡쳐툴
  • android
  • 사업 이야기
  • 전자정부프레임워크
  • sqlgate
  • 중독성게임
  • 이클립스
  • 플래시 게임
  • EkNote
  • iBATIS
  • toad
  • 색상코드표
  • 가상화폐무료
  • rocketdock
  • 개한민국
  • Jboss
  • ERwin
  • Flash Player
  • Eclipse
  • 이미지 편집

글 보관함

«   2026/01   »
일 월 화 수 목 금 토
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

링크

카테고리

분류 전체보기 (792)
행운이와함께 (1)
EkNote Project (18)
ARIS (0)
Android (2)
LINK (39)
UML (9)
Programming (154)
Cobol (0)
ASP (0)
CSS (5)
C_C++ (2)
IBatis (2)
JSP (3)
JAVA (76)
JavaScript (44)
PHP (2)
Utility (76)
Protable (3)
MobileProgram (4)
SKT (0)
KTF (0)
LGT (0)
자료들 (4)
DB (82)
mongoDB (0)
MySQL (8)
Oracle (61)
MSSQL (4)
Graphic (8)
Flash (3)
PhotoShop (3)
SourceFactory (4)
Collection (73)
작가의기막힌상상력 (14)
미소를찾아보는공간 (44)
내심장은작동중일까 (6)
멀더와스컬리의노트 (3)
이건어디에사용할까 (6)
Edward (275)
나만 알기엔 아까워 (100)
기억하기 위한 기록 (123)
시선이 머무는 공간 (50)
숨기고 싶은 이야기 (2)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
Edward. K's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

IT정리노트

메멘토적 기억능력을 소유한 개발자 노트.

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 분류 전체보기 (792)
    • 행운이와함께 (1)
    • EkNote Project (18)
    • ARIS (0)
    • Android (2)
    • LINK (39)
    • UML (9)
    • Programming (154)
      • Cobol (0)
      • ASP (0)
      • CSS (5)
      • C_C++ (2)
      • IBatis (2)
      • JSP (3)
      • JAVA (76)
      • JavaScript (44)
      • PHP (2)
    • Utility (76)
      • Protable (3)
    • MobileProgram (4)
      • SKT (0)
      • KTF (0)
      • LGT (0)
      • 자료들 (4)
    • DB (82)
      • mongoDB (0)
      • MySQL (8)
      • Oracle (61)
      • MSSQL (4)
    • Graphic (8)
      • Flash (3)
      • PhotoShop (3)
    • SourceFactory (4)
    • Collection (73)
      • 작가의기막힌상상력 (14)
      • 미소를찾아보는공간 (44)
      • 내심장은작동중일까 (6)
      • 멀더와스컬리의노트 (3)
      • 이건어디에사용할까 (6)
    • Edward (275)
      • 나만 알기엔 아까워 (100)
      • 기억하기 위한 기록 (123)
      • 시선이 머무는 공간 (50)
      • 숨기고 싶은 이야기 (2)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바