현재 시각을 컨솔에 보여주는 간단한 애플리케이션의 Python 언어 소스 코드이다.
UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다.
* UTC(Universal Time Coordinated, 협정세계시, 協定世界時)

 

Common Lisp 언어에서 (get-universal-time) 하여 얻은 값은 UTC(1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초)가 아니라, 1900년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초이다. 따라서 이 값을 기준으로 UTC를 구하려면 1900년 1월 1일 0시 0분 0초부터 1970년 1월 1일 0시 0분 0초까지 경과된 초를 구하여 빼 주어야 나온다. 그런데 Common Lisp 언어에서는 GMT 시각값을 초로 환산하여 보정해주어야 제대로 된 UTC 값을 구할 수 있다.


GMT 시각값을 초로 환산한 값이 (* (nth 8 cNow) 60 60) 이고, 이 만큼 보정하는 과정이 아래 소스의 20째 줄

      (setf utctime (+ (- univ-time *base*) (- *base2* *base*) (* (nth 8 cNow) 60 60)))

이다. 여기서 (* (nth 8 cNow) 는 GMT 시각값의 반대 부호이다.

 

  1. #!/usr/bin/env clisp
  2. ;;  Filename: testCTime.lsp
  3. ;;
  4. ;;  Execute: clisp testCTime.lsp
  5. ;; Common Lisp case
  6. (setf *weekNames* (list "월" "화" "수" "목" "금" "토" "일"))
  7. (setf univ-time (get-universal-time))
  8. (setf cNow (multiple-value-list (decode-universal-time univ-time)))
  9. (setq *base* (encode-universal-time 0 0 0 1 1 1971))
  10. (setq *base2* (encode-universal-time 0 0 0 1 1 1972))
  11. (setq *takeoff* (encode-universal-time 0 0 0 1 1 2013))
  12. (setq *takeoff2* (encode-universal-time 0 0 0 2 1 2013))
  13. (setq *one-day-secs* (- *takeoff2* *takeoff*))
  14. (setq *secs* univ-time)
  15. (setq *daysecs* (- *secs* *takeoff*))
  16. (setf utctime (+ (- univ-time *base*) (- *base2* *base*) (* (nth 8 cNow) 60 60)))
  17. (format t "UTC: ~D초~%" utctime)
  18. ;; 현재 시각 표시: 200x년 x월 xx일 (x요일) xx시 xx분 xx초 (GMT nn)
  19. (format t "~D년 ~D월 ~D일 (~A요일) ~D시 ~D분 ~D초 (GMT~@D)~%"
  20.         (nth 5 cNow)
  21.         (nth 4 cNow)
  22.         (nth 3 cNow)
  23.         (nth (nth 6 cNow) *weekNames*)
  24.         (nth 2 cNow)
  25.         (nth 1 cNow)
  26.         (nth 0 cNow)
  27.         (- (nth 8 cNow)) )
  28. ;; 1월 1일은 1, 1월 2일은 2
  29. (setf strIsDST (if (equal (nth 7 cNow) nil)
  30.                     "안함"
  31.                     "함" ) )
  32. (setq *days* (1+ (floor *daysecs* *one-day-secs*)))
  33. (format t "올해 몇 번째 날: ~D, 서머타임 적용 여부: ~A~%" *days* strIsDST)



실행> clisp testCTime.lsp
UTC: 1378044909초
2013년 9월 1일 (일요일) 23시 15분 9초 (GMT+9)
올해 몇 번째 날: 244, 서머타임 적용 여부: 안함



 

Posted by Scripter
,