Animated Rainbow Nyan Cat

 

์Šค์ผ€์ค„์„ ์„ค์ •ํ•˜๊ณ  ์Šค์ผ€์ค„์„ ๋“ฑ๋กํ•  ๋•Œ, ๋งค์ผ/๋งค์ฃผ/๋งค์›” ์ค‘ ํƒ1์„ ํ•ด ๋“ฑ๋ก์ด ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์กฐํšŒํ–ˆ์„ ์‹œ ๋‹ค์Œ ์•Œ๋žŒ์ด ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋Š”์ง€๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ. ์—ฐ๋„๋Š” ๋ชจ๋‘ 2024๋กœ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ
String msg = "";
LocalDateTime now = LocalDateTime.now();
long differenceInMillis = Timestamp.valueOf(startT).getTime() - Timestamp.valueOf(now).getTime();
long days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
long hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
long minutes = (differenceInMillis / (60 * 1000L)) % 60;
long seconds = (differenceInMillis / 1000) % 60;

differenceInMillis ์— ์•Œ๋žŒ ์‹œ์ž‘์ผ๊ณผ ํ˜„์žฌ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•ด ๋„ฃ์—ˆ๋‹ค. ์ด๋•Œ, ํ˜„์žฌ ์‹œ๊ฐ„์ด ๋” ์•ž์ผ ๊ฒฝ์šฐ ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐ˜ํ™˜ํ•œ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’์„ ์ผ, ์‹œ, ๋ถ„, ์ดˆ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

๋งค์ผ
if (differenceInMillis < 0) {
    if (minutes <= 0 || seconds <= 0) {
        hours = 23 + ((differenceInMillis / (60 * 60 * 1000L)) % 24);
    } else {
        hours = 24 + ((differenceInMillis / (60 * 60 * 1000L)) % 24);
    }
    if (seconds <= 0) {
        minutes = 59 + ((differenceInMillis / (60 * 1000L)) % 60);
    } else {
        minutes = 60 + ((differenceInMillis / (60 * 1000L)) % 60);
    }
    seconds = 60 + ((differenceInMillis / 1000) % 60);
}
msg = hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";

differenceInMillis ๊ฐ€ ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๊ฒฝ์šฐ ์ด๋ฏธ ์Šค์ผ€์ค„์ด ์ง€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์Šค์ผ€์ค„ ์•Œ๋žŒ์„ ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค. (์–‘์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๊ฒฝ์šฐ๋Š” ๊ทธ๋Œ€๋กœ msg๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.) ๋˜ํ•œ, minutes ๋‚˜ seconds๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ์‹œ๊ฐ„์—์„œ 1์„ ๋” ๋นผ์ฃผ๊ณ , ์•„๋‹ ๊ฒฝ์šฐ hours๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.

๋˜ํ•œ, seconds๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ minutes์—์„œ 1์„ ๋” ๋นผ์ฃผ๊ณ , ์•„๋‹ ๊ฒฝ์šฐ minutes๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.

๋งค์ฃผ
if (differenceInMillis < 0) {
    int diff = now.getDayOfYear() - startT.getDayOfYear();
    diff = diff / 7;
    differenceInMillis = Timestamp.valueOf(startT.plusWeeks(diff + 1)).getTime() - Timestamp.valueOf(now).getTime();
    days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
    hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
    minutes = (differenceInMillis / (60 * 1000L)) % 60;
    seconds = (differenceInMillis / 1000) % 60;
}
msg = days + "์ผ " + hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";

differenceInMillis ๊ฐ€ ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๊ฒฝ์šฐ ์ด๋ฏธ ์Šค์ผ€์ค„์ด ์ง€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ์ฃผ์˜ ์Šค์ผ€์ค„ ์•Œ๋žŒ์„ ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค. ๋งŒ์•ฝ, ์•Œ๋žŒ์„ 2024-05-10 12:00:00(๊ธˆ์š”์ผ)์— ๋งž์ถฐ๋†จ์„ ๊ฒฝ์šฐ์—๋„, ๋งค์ฃผ ์•Œ๋žŒ์„ ๋งž์ถฐ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์Œ ์•Œ๋žŒ์€ ํ˜„์žฌ ์‹œ์ ( 2024-08-14 )์—์„œ 2024-08-16 12:00:00(๊ธˆ์š”์ผ)์— ์šธ๋ฆด ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, ํ˜„์žฌ์™€ ์Šค์ผ€์ค„์˜ ์ฃผ์ฐจ๋ฅผ ๊ตฌํ•˜๊ณ  ๊ธฐ์กด ์Šค์ผ€์ค„ ๋‚ ์งœ์— ๊ทธ๋งŒํผ์„ ๋”ํ•œ ํ›„์— ํ˜„์žฌ ๋‚ ์งœ์™€์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•ด์„œ ์‹œ๊ฐ„์ฐจ๋ฅผ ๊ตฌํ–ˆ๋‹ค. 

๋งค์›”
if (differenceInMillis < 0) {
    int diff = now.getMonthValue() - startT.getMonthValue();
    long diffMills = Timestamp.valueOf(now).getTime() - Timestamp.valueOf(startT.plusMonths(diff)).getTime();
    if (diffMills > 0) {
        differenceInMillis = Timestamp.valueOf(startT.plusMonths(diff + 1)).getTime() - Timestamp.valueOf(now).getTime();
    } else {
        differenceInMillis = Timestamp.valueOf(startT.plusMonths(diff)).getTime() - Timestamp.valueOf(now).getTime();
    }
    days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
    hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
    minutes = (differenceInMillis / (60 * 1000L)) % 60;
    seconds = (differenceInMillis / 1000) % 60;
}
msg = days + "์ผ " + hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";

differenceInMillis ๊ฐ€ ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๊ฒฝ์šฐ ์ด๋ฏธ ์Šค์ผ€์ค„์ด ์ง€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ๋‹ฌ์˜ ์Šค์ผ€์ค„ ์•Œ๋žŒ์„ ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ™์€ ๋‹ฌ์ด๋ผ๊ณ  ์น ๋•Œ(๋‹ค๋ฅธ ๋‹ฌ์ž„์—๋„), ํ˜„์žฌ์˜ ๋‚ ์งœ๊ฐ€ ์Šค์ผ€์ค„์˜ ๋‚ ์งœ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์Šค์ผ€์ค„ ์•Œ๋žŒ์„ ํ˜„์žฌ์˜ ๋‹ค์Œ ๋‹ฌ๋กœ ๋งž์ถ”๋„๋ก ๊ตฌํ˜„ํ–ˆ๊ณ , ๊ฐ™์€ ๋‹ฌ์ด๋ผ๊ณ  ์น ๋•Œ (๋‹ค๋ฅธ ๋‹ฌ์ž„์—๋„) , ํ˜„์žฌ์˜ ๋‚ ์งœ๊ฐ€ ์Šค์ผ€์ค„์˜ ๋‚ ์งœ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์Šค์ผ€์ค„ ์•Œ๋žŒ์„ ํ˜„์žฌ์˜ ๋‹ฌ๋กœ ๋งž์ถ”๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค์ผ€์ค„์„ 2024-01-04 00:00:01์— ๋งž์ถฐ๋†จ์„ ๊ฒฝ์šฐ, ํ˜„์žฌ ์‹œ์  ( 2024-08-14 )์—์„œ ๋ณผ๋•Œ, ์•Œ๋žŒ์€ 2024-09-04 00:00:01์— ์šธ๋ฆด ๊ฒƒ์ด๋‹ค.

์ „์ฒด์ฝ”๋“œ
//์•Œ๋žŒ ํ‘œ์‹œ
public String getAlarm(){
    String msg="";
    LocalDateTime now = LocalDateTime.now();
    long differenceInMillis = Timestamp.valueOf(startT).getTime() - Timestamp.valueOf(now).getTime();
    long days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
    long hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
    long minutes = (differenceInMillis / (60 * 1000L)) % 60;
    long seconds = (differenceInMillis / 1000) % 60;
    switch (repeat) {
        case "๋งค์ผ":
            if (differenceInMillis<0) {
                if(minutes<=0||seconds<=0){
                    hours = 23 + ((differenceInMillis / (60 * 60 * 1000L)) % 24);
                }else{
                    hours = 24 + ((differenceInMillis / (60 * 60 * 1000L)) % 24);
                }
                if(seconds<=0){
                    minutes = 59 + ((differenceInMillis / (60 * 1000L)) % 60);
                }else{
                    minutes = 60 + ((differenceInMillis / (60 * 1000L)) % 60);
                }
                seconds = 60 + ((differenceInMillis / 1000) % 60);
            }
            msg = hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";
            break;
        case "๋งค์ฃผ":
            if (differenceInMillis<0) {
                int diff = now.getDayOfYear() - startT.getDayOfYear();
                diff = diff / 7;
                differenceInMillis = Timestamp.valueOf(startT.plusWeeks(diff + 1)).getTime() - Timestamp.valueOf(now).getTime();
                days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
                hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
                minutes = (differenceInMillis / (60 * 1000L)) % 60;
                seconds = (differenceInMillis / 1000) % 60;
            }
            msg = days + "์ผ " + hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";
            break;
        case "๋งค์›”":
            if (differenceInMillis<0) {
                int diff = now.getMonthValue()-startT.getMonthValue();
                long diffMills = Timestamp.valueOf(now).getTime() - Timestamp.valueOf(startT.plusMonths(diff)).getTime();
                if(diffMills>0){
                    differenceInMillis = Timestamp.valueOf(startT.plusMonths(diff+1)).getTime() - Timestamp.valueOf(now).getTime();
                }else{
                    differenceInMillis = Timestamp.valueOf(startT.plusMonths(diff)).getTime() - Timestamp.valueOf(now).getTime();
                }
                days = (differenceInMillis / (24 * 60 * 60 * 1000L)) % 365;
                hours = (differenceInMillis / (60 * 60 * 1000L)) % 24;
                minutes = (differenceInMillis / (60 * 1000L)) % 60;
                seconds = (differenceInMillis / 1000) % 60;
            }
            msg = days + "์ผ " + hours + "์‹œ๊ฐ„ " + minutes + "๋ถ„ " + seconds + "์ดˆ ์ „์ž…๋‹ˆ๋‹ค.";
            break;
    }
    return msg;
}