NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Error Exception in thread "main" java.time.temporal.UnsupportedTem…

    페이지 정보

    본문

    자바는 날짜 시간을 처리하는게 매우 번거롭습니다. 자바 1.8(Java 8)에 와서 LocalDate, LocalDateTime이 추가되어서 그나마 좀 괜찮아졌지만요. 그래도, C#의 DateTime에 비하면 여전히 불편한건 사실입니다. 그래도 뭐 그전에 Calendar나 DateTimeFormatter를 사용하던 때에 비하면 많이 좋아지긴 했습니다. 아무튼, 아래와 같이 스케줄러에서 이전 시간과 비교해서 처리하는 로직이 있습니다. 맥시멈이 45초이기 때문에 초단위로 비교해서 처리 해줘야 합니다.

    tmrT3.schedule(new TimerTask() {
    	@Override
    	public void run() {
    		LocalDate time = LocalDate.now().minus(t3Timeout, ChronoUnit.SECONDS);
    		for (int i = 0; i < sendTimeoutList.size(); i++) {
    		...
    		...

     

    그런데 생각해보니 LocalDate 클래스도 있고, LocalDateTime 클래스도 있습니다. 관련 문서를 살펴보면 LocalDate는 년, 월, 일을 처리하기위한 클래스라고 되어 있네요. 그렇다보니 날짜를 계산하기엔 괜찮지만, 이전과 현재의 시, 분, 초를 계산할수는 없었습니다. 만약, 정확하게 날짜, 시간 계산이 필요한게 아니라면(리밋이 초가 아닌 일(Day)로 넘어가는 경우가 없다면) 아래와 같이 코드를 변경하면 됩니다.

    tmrT3.schedule(new TimerTask() {
    	@Override
    	public void run() {
    		LocalDateTime time = LocalDateTime.now().minus(t3Timeout, ChronoUnit.SECONDS);
    		for (int i = 0; i < sendTimeoutList.size(); i++) {
    		...
    		...

     

    그리고, 또 문제가 있는데요. 날짜를 계산할 때 오늘과 내일이 달라야 하죠? 그런데, LocalDate에서 날짜를 계산해보면 하루가 지났음에도 차이가 0으로 나올때가 있습니다. 이 문제는 내부적으로 날짜를 초로 변환한 후 하루만큼의 초(86,400)가 넘어갔는지를 체크하기 때문입니다. 예를들어 오늘 오후 11시 59분 59초와 내일 00시 00분 00초라도 날짜 계산은 0이 나오게 됩니다. 그래서, LocalDate에는 atStartOfDay라는 메소드가 존재합니다. 이 메소드는 LocalDate의 년, 월, 일은 그대로 사용하고 시간은 하루의 시작이자 끝시간으로 맞춘 후 LocalDateTime을 반환합니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.