2 releases
0.1.1 | Jun 3, 2024 |
---|---|
0.1.0 | Jun 3, 2024 |
#252 in Date and time
11KB
80 lines
com_local_time
컴퓨터 시계로 우리나라 시간 및 다른 나라 시계 구현
UNIX_EPOCH이용하여 loop하면 됩니다.
use std::{ io::Write,
thread::sleep,
time::{SystemTime, UNIX_EPOCH},
};
const SEC_IN_MIN: u64 = 60;
const SEC_IN_HOUR: u64 = 60 * SEC_IN_MIN;
const SEC_IN_DAY: u64 = 24 * SEC_IN_HOUR;
const SEC_IN_YEAR: u64 = 365 * SEC_IN_DAY;
const SEC_IN_LEAP_YEAR: u64 = 366 * SEC_IN_DAY;
fn is_leap_year(year: u64) -> bool {
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
}
fn main() {
loop {
let total_sec: u64 = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_secs();
let mut remaining_sec = total_sec;
// Calculate the current year
let mut year = 1970;
while remaining_sec >= SEC_IN_YEAR {
let year_seconds = if is_leap_year(year) {
SEC_IN_LEAP_YEAR
} else {
SEC_IN_YEAR
};
if remaining_sec < year_seconds {
break;
}
remaining_sec -= year_seconds;
year += 1;
}
// Calculate the current month and day
const DAYS_IN_MONTH: [u64; 12] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const DAYS_IN_LEAP_MONTH: [u64; 12] = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const DAYS_OF_WEEK: [&str; 7] = ["월", "화", "수", "목", "금", "토", "일"];
let days_in_month = if is_leap_year(year) {
&DAYS_IN_LEAP_MONTH
} else {
&DAYS_IN_MONTH
};
let mut month = 0;
let mut days = remaining_sec / SEC_IN_DAY;
remaining_sec %= SEC_IN_DAY;
while month < 12 && days >= days_in_month[month] {
days -= days_in_month[month];
month += 1;
}
// Calculate the current hour, minute, and second
let hours = remaining_sec / SEC_IN_HOUR;
remaining_sec %= SEC_IN_HOUR;
let minutes = remaining_sec / SEC_IN_MIN;
let seconds = remaining_sec % SEC_IN_MIN;
let day_of_week_cal = (days + 2) % 7;
let week_cal = DAYS_OF_WEEK[day_of_week_cal as usize];
print!(
"\r{}년 {}월 {}일 {}요일, {}: {}: {}",
year,
month + 1,
days + 1,
week_cal,
hours + 9,
minutes,
seconds,
);
std::io::stdout().flush().unwrap();
sleep(std::time::Duration::from_secs(1));
}
}
Result
2024년 6월 3일 금요일, 19: 41: 19