자바스크립트로 공공 API활용하여 XML 일출시간 일몰시간 가져오기

일단 소스는 이렇다. 

<script>
var getLCRiseSetInfocnt=0;
function getLCRiseSetInfo()
{
	getLCRiseSetInfocnt++;
	var today = new Date();
	var year = today.getFullYear();
	var month = today.getMonth() + 1; // 월은 0부터 시작하므로 1을 더해줍니다.
	var day = today.getDate();
	// 월과 일이 한 자리 숫자인 경우 앞에 0을 추가합니다.
	month = month < 10 ? '0' + month : month;
	day = day < 10 ? '0' + day : day;
	var formattedDate = year + '' + month + '' + day;
	console.log('오늘의 날짜: ' + formattedDate);
	var encodedServiceKey = encodeURIComponent('서비스키값');
	$.ajax({
	    url: 'http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService/getLCRiseSetInfo',
	    type: 'GET',
	    data: {
	        serviceKey: encodedServiceKey,
	        locdate: formattedDate,
	        longitude: '위도',
	        latitude: '경도',
	        dnYn: 'Y'
	    },
	    dataType: 'xml',
	    success: function(responseXml) {
	        console.log('Success:', responseXml);
	     // 서버 응답 성공 시 처리
	        var $xml = $(responseXml);
	
	        // 필요한 정보 추출
	        var sunrise = $xml.find('sunrise').text();
	        var sunset = $xml.find('sunset').text();
	        //var moonrise = $xml.find('moonrise').text();
	        //var moonset = $xml.find('moonset').text();
			//실행n번째 결과
	        console.log('n번째 결과 :',  getLCRiseSetInfocnt);
	        // 추출한 정보 출력 또는 다른 작업 수행
	        console.log('일출 : Sunrise:', sunrise);
	        console.log('일몰 : Sunset:', sunset);
	        //console.log('Moonrise:', moonrise);
	        //console.log('Moonset:', moonset);
	         
	        //결과값을 받아왔으면 멈춘다.
	        if(sunrise!='')
	        {
	        	checkAndStopInterval();
	        	var Sunrise =  formatTime(sunrise);
	        	var Sunset = formatTime(sunset);
	        	
	        	document.getElementById('Sunrise').innerText = Sunrise;
	            document.getElementById('Sunset').innerText = Sunset;
	            document.getElementById('mSunrise').innerText = Sunrise;
	            document.getElementById('mSunset').innerText = Sunset;
                //ID값을 찾아 innerText로 값을 변경해준다.
	        }
	    },
	    error: function(error) {
	        console.log('Error:', error);
	        getLCRiseSetInfo();
	        // 서버 응답 에러 시 처리
	    }
	});
}
//최초실행
getLCRiseSetInfo();
//3초마다 실행되게 한다.
var intervalId = setInterval(getLCRiseSetInfo, 3000);
//루프를 멈추게 한다. 
function checkAndStopInterval() {
	console.log('값을 받음');
	clearInterval(intervalId);
}
function formatTime(timeString) {
    // 앞에 0을 추가하여 4자리로 만들기
     timeString = timeString.padStart(4, '0');

    // 시간과 분으로 분리
    var hours = timeString.slice(0, 2);
    var minutes = timeString.slice(2);

    // 포맷팅된 문자열 반환
    return hours + ':' + minutes;
}
</script>
  • 일몰시간

    00:00

  • 일출시간

    00:00

주석을 충분히 달아 놓아 활용하는데 무리는 없을 것이라 봅니다. 

수고하세요.

참고사이트 : https://www.data.go.kr/data/15012688/openapi.do

 

한국천문연구원_출몰시각 정보

(천문우주정보)지역별 해달 출몰시각정보, 위치별 해달 출몰시각정보를 조회하는 서비스 입니다. 활용 시 날짜, 지역, 경도, 위도, 일출시각, 일몰시각, 일중시각, 월출시각, 월중시각, 월몰시각,

www.data.go.kr

 

이렇게 구축하니 로컬에서는 문제가 안보였는데 (왜인지 모름)

서버에 올리니 문제가 발생했네요. 

CORS (Cross-Origin Resource Sharing) 문제로 인한 오류로 브라우저에서 동일 출처 정책(Same-Origin Policy)에 위배되는 경우, 브라우저는 보안상의 이유로 외부 도메인으로의 AJAX 요청을 차단된다고 합니다.

그래서 급히 수정해봅니다. 

function getLCRiseSetInfo()
{
	getLCRiseSetInfocnt++;
	
	var today = new Date();
	var year = today.getFullYear();
	var month = today.getMonth() + 1; // 월은 0부터 시작하므로 1을 더해줍니다.
	var day = today.getDate();
	// 월과 일이 한 자리 숫자인 경우 앞에 0을 추가합니다.
	month = month < 10 ? '0' + month : month;
	day = day < 10 ? '0' + day : day;
	var formattedDate = year + '' + month + '' + day;
	
	var url = '/ajx/getLCRiseSetInfo';   		
	var sql_state_value = "GetData";
	var data = JSON.stringify({
		   sql_state : sql_state_value
		 , locdate : formattedDate
	});
	getPostData(url,data,callback_getLCRiseSetInfo);
}
function callback_getLCRiseSetInfo(result)
{
	console.log('n번째 결과 :',  getLCRiseSetInfocnt);
	console.log(result.result);
	if(result.result=='ok')
	{	
		var responseXml = result.xml;
		var $xml = $(responseXml);
		// 필요한 정보 추출
        var sunrise = $xml.find('sunrise').text();
        var sunset = $xml.find('sunset').text();
        //var moonrise = $xml.find('moonrise').text();
        //var moonset = $xml.find('moonset').text();
		//실행n번째 결과
        console.log('n번째 결과 :',  getLCRiseSetInfocnt);
        // 추출한 정보 출력 또는 다른 작업 수행
        console.log('일출 : Sunrise:', sunrise);
        console.log('일몰 : Sunset:', sunset);
        //console.log('Moonrise:', moonrise);
        //console.log('Moonset:', moonset);
         
        
        if(sunrise!='')
        {
        	checkAndStopInterval();
        	var Sunrise =  formatTime(sunrise);
        	var Sunset = formatTime(sunset);
        	
        	document.getElementById('Sunrise').innerText = Sunrise;
            document.getElementById('Sunset').innerText = Sunset;
            document.getElementById('mSunrise').innerText = Sunrise;
            document.getElementById('mSunset').innerText = Sunset;
        }
        if(getLCRiseSetInfocnt>7)
        {
        	checkAndStopInterval();
        }
	}
}
getLCRiseSetInfo();
var intervalId = setInterval(getLCRiseSetInfo, 5000);
function checkAndStopInterval() {
	console.log('값을 받음');
	clearInterval(intervalId);
}
function formatTime(timeString) {
    // 앞에 0을 추가하여 4자리로 만들기
     timeString = timeString.padStart(4, '0');

    // 시간과 분으로 분리
    var hours = timeString.slice(0, 2);
    var minutes = timeString.slice(2);

    // 포맷팅된 문자열 반환
    return hours + ':' + minutes;
}

//추가로 컨트롤러에 XML데이터를 요청하는 코드를 작성하여 XML을 받아오게 하였습니다.
					function getContextPath(){
            		    var ctxPath=$("#web_contextPath").val();
            		    return ctxPath;
            		}
            		function getPostData(inurl,indata,myfunction,in_async)  		
            		{
            			var async_value=true;
            			if(in_async==false)
            			{
            				async_value=false;
            			}
            		$.ajax({
            			type : 'post',
            			url : getContextPath()+inurl,
            			headers : {
            				"Content-Type" : "application/json",
            				"X-HTTP-Method-Override" : "POST",
            				'X-CSRF-TOKEN': $("#csrf_token").val()
            			},
            			dataType : 'text',
            			data : indata,
            			async: async_value,
            			error:function(request,status,error)
            			{
            				//alert("알림",status+error);
            				console.log("ajax error : " + status+","+error);
            			},				
            			success : function(result) {									
            				//console.log("result: " + result);
            				var obj = jQuery.parseJSON( result );	
            				if(myfunction!=null)
            				{
            					myfunction(obj);
            				}
            			}
            		});
            	}
</script>

자바 소스단은  https://www.data.go.kr/data/15012688/openapi.do 제공소스 자바부분을 참고하여 만들었습니다. 

//일출일몰 API사용하기
	@ResponseBody
	@RequestMapping(value = "/getLCRiseSetInfo", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
	public CommonData getLCRiseSetInfo(@RequestBody CommonData dto) throws Exception {
		smsp.print_String("/ajxAgent/get_cal_month_data");
		CommonData result_map = new CommonData();
		smsp.print_CommonData(dto);
		Calendar cal = Calendar.getInstance();
		String locdate = dto.get("locdate", "20240311");		
		StringBuilder sb = new StringBuilder();
		try {
		
		StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService/getLCRiseSetInfo"); /*URL*/
	    urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "서비스 키"); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("locdate","UTF-8") + "=" + URLEncoder.encode(locdate, "UTF-8")); /*날짜*/
        urlBuilder.append("&" + URLEncoder.encode("longitude","UTF-8") + "=" + URLEncoder.encode("XXX.3673", "UTF-8")); /*위도*/
        urlBuilder.append("&" + URLEncoder.encode("latitude","UTF-8") + "=" + URLEncoder.encode("XXX.50363", "UTF-8")); /*경도*/
        urlBuilder.append("&" + URLEncoder.encode("dnYn","UTF-8") + "=" + URLEncoder.encode("Y", "UTF-8")); /**/
        
        URL url = new URL(urlBuilder.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        //System.out.println("Response code: " + conn.getResponseCode());
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        rd.close();
        conn.disconnect();
        result_map.put("result", "ok"); 
        result_map.put("xml", sb.toString()); 
		} catch (Exception e) {
			// TODO: handle exception
			result_map.put("result", "fail");
		}
		return result_map;
	}

이상입니다. 수고하세요.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

자바 음력 날짜를 양력 날짜로 변환

public class LunarConverter {
    public static String lun2sol(String yyyymmdd) {
        int getYear = Integer.parseInt(yyyymmdd.substring(0, 4));
        int getMonth = Integer.parseInt(yyyymmdd.substring(4, 6));
        int getDay = Integer.parseInt(yyyymmdd.substring(6, 8));

        // 필요한 배열과 데이터를 Java 형식에 맞게 선언

        if (getYear <= 1881 || getYear >= 2050) {
            return "false"; // 년도 범위가 벗어남
        }
        if (getMonth > 12) {
            return "false"; // 달수 범위가 벗어남
        }
        int m1 = getYear - 1881;
        int YunMonthFlag;
        if (arrayDATA[m1].charAt(12) == '0') {
            YunMonthFlag = 0;
        } else {
            if (arrayDATA[m1].charAt(getMonth - 1) > '2') {
                YunMonthFlag = 1;
            } else {
                YunMonthFlag = 0;
            }
        }

        // 나머지 알고리즘 부분을 Java로 변환하여 작성

        return (smonth + "|" + sday + "|" + sweek);
    }

    public static void main(String[] args) {
        // 테스트를 위한 호출과 출력
        String result = lun2sol("20231218"); // 양력 날짜 입력
        System.out.println("음력 날짜: " + result);
    }
}
블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

특정일 기준으로 작동하기 

JavaScript를 사용한 날짜 비교 함수 작성하기

날짜와 시간을 다루는 JavaScript의 기능을 활용하여 특정 날짜와 현재 날짜를 비교하는 함수를 만들어 보겠습니다. 이 함수는 웹 애플리케이션에서 유용하게 사용될 수 있으며, 예를 들어 특정 이벤트나 기한이 마감되었는지 확인하는 데 도움이 됩니다.

코드 예제:

function checkDate3() {
    // 목표 날짜 설정 (여기에서는 2023년 10월 31일 00:00:00)
    var targetDate = new Date("2023-10-31T00:00:00");
    var currentDate = new Date();

    // 현재 날짜와 목표 날짜를 비교
    if (currentDate > targetDate) {
        alert("마감되었습니다.");
    } else {
        window.location.href = "${pageContext.request.contextPath}/1234/1111.do"; // 페이지 이동할 URL을 입력하세요.
    }
}

코드 설명:

targetDate 변수에는 목표 날짜 및 시간이 설정됩니다. 이 날짜는 "YYYY-MM-DDTHH:MM:SS" 형식으로 지정됩니다. 이 코드에서는 2023년 10월 31일 00:00:00을 목표 날짜로 설정했습니다.

currentDate 변수에는 현재 날짜와 시간이 저장됩니다.

if 문을 사용하여 현재 날짜와 목표 날짜를 비교합니다. 현재 날짜가 목표 날짜보다 크면 "마감되었습니다."라는 경고 메시지가 표시됩니다.

그렇지 않은 경우, 특정 페이지로 이동하도록 지정된 URL로 리디렉션됩니다.

이 함수는 현재 날짜와 목표 날짜를 비교하여 원하는 작업을 수행하는 데 사용할 수 있으며, 웹 애플리케이션에서 기한을 추적하거나 이벤트를 관리하는 데 유용합니다. JavaScript를 사용하여 날짜 및 시간을 처리하는 방법을 익혔으므로 이를 다양한 상황에 적용할 수 있을 것입니다.

이제 이 함수를 웹 애플리케이션 프로젝트에 통합하여 날짜 기반 작업을 자동화하실 수 있습니다.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,