프로그래밍 일기 — 날짜와 시간

배우는 자(Learner Of Life)
9 min readJun 22, 2023

--

컴퓨터에서 시간 가지고 놀기

#날짜, #시간, #Java.time, #패키지, #LocalDateTime, #DateTimeFormatter

컴퓨터에서 시간정보를 어떻게 활용할 수 있을까?(1)

현실에서 인간이 느낄 수 있는 차원에는 두 가지가 있다. 하나가 공간이고 다른 하나는 시간이다. 공간은 비행기, 차, 버스 등 여러 운송수단을 통해 이동할 수 있지만, 시간은 한번 흐르면 절대 되돌릴 수 없다. 시간은 그 만큼 인간에게 있어 매우 중요하다. 한번 소모하면 다시 돌아오지 않기 때문이다.

인간이 컴퓨터를 포함한 모든 기계를 발명한 이후에도 이 사실은 변하지 않는다. 특히 1분 1초가 중요한 현대 비즈니스 사회에서는 시간은 역사상 그 어느 때보다 매우 중요한 정보이자 자원이다. 컴퓨터를 이용해 몇 시까지 중요 문서를 보내야하고, 정해진 시기까지 소프트웨어를 업데이트하거나 릴리즈해야하는 시대다. 만약 내 컴퓨터가 표준 시간대에 맞춰져 있지 않거나, 제대로 조정이 안되어 있다면 분명히 문제가 된다. 예를 들어 일을 하던 와중 상사로부터 어떤 문서를 오후 4시 쯤에 전달해 달라고 부탁을 받았는데, 내 컴퓨터의 시간이 1시간 늦게 맞춰져있다면, 이를 확실하게 인지하고 있지 않는한 컴퓨터 상에 보이는 시간대를 믿어버릴 수 있다. 컴퓨터 표기 시간으로는 분명히 오후 4시에 보냈는데, 실제 시간은 오후 5시에 보낸 것이 된다. 분명 이러한 상황을 원하는 사람은 없을 것이다.

그렇다면 컴퓨터에서는 어떻게 시간을 알아보고 조정할 수 있을까? 프로그래밍에서는 이를 어떻게 활용할 수 있을까?

Java에서의 날짜와 시간

컴퓨터에서는 시간에 맞추어 여러 기능을 제공해야할 때가있다. 예를 들어 사용자가 저녁 8시 이후에는 인터페이스가 검은색으로 바뀌는 Dark Mode를 적용하고 싶다면, 그 시간에 맞추어 인터페이스를 변화시켜야 할 것이다. 프로그래밍 세계에서는 Java를 포함한 프로그래밍 언어에서 날짜와 시간을 처리하는 클래스를 제공한다.

Java.time package활용

Java상에서 날짜와 시간을 이용한 작업을 할 때 유용하게 쓰이는 패키지이다. 패키지는 클래스의 묶음이라고 볼 수 있으며, 클래스 및 인터페이스가 포함될 수 있고, 주로 서로 관련이 있는 클래스끼리 묶어 놓기 때문에 관리 및 참조가 쉽다.

아래는 해당 패키지를 활용해 시간 정보를 출력 및 입력하는 예제이다. .now() 매서드를 통해 현재 시간 정보를 가져올 수 있고, .of() 매서드를 통해 현재 시간 정보를 입력할 수 있다. LocalDateLocalTime 클래스는 이 패키지에서 제공하는 가장 기본적인 클래스들이.

// 날짜와 시간 예제

// java.time package를 가져온다.
import java.time.*;

// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
System.out.println("---- now()를 활용하여 생성 ----");
LocalDate date = LocalDate.now(); // .now() 매서드를 통해 현재 로컬 날짜 정보 가져오기
LocalTime time = LocalTime.now(); // .now() 매서드를 통해 현재 로컬 시간정보 가져오기
LocalDateTime dateTime = LocalDateTime.now(); // .now() 매서드를 통해 현재 로컬 날짜와 시간 정보 가져오기
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
System.out.println("---- of()를 활용하여 생성 ----");
LocalDate newDate = LocalDate.of(2023, 06, 23); // .of() 매서드를 통해 현재 로컬 날짜 정보 입력하기
LocalTime newTime = LocalTime.of(12, 40, 55); // .of() 매서드를 통해 현재 로컬 시간정보 입력하기
System.out.println(newDate);
System.out.println(newTime);
}
}

>>

---- now()를 활용하여 생성 ----
2023-06-22 // LocalDate.now()
12:41:30.709203 // LocalTime.now()
2023-06-22T12:41:30.709216 // LocalDateTime.now()
---- of()를 활용하여 생성 ----
2023-06-23 // LocalDate.of(년, 월, 일)
12:40:55 // LocalDate.of(시, 분, 초)

위 예제에서 각 클래스마다 출력되는 형식이 조금 씩 다른 것을 알 수 있다. 만약 출력 시간 정보의 형식을 통일 시켜야한다면, 포맷을 조정할 필요가 있다. 시간 정보는 아래 예제와 같이 포맷팅할 수 있다. LocalDate.now() 만 활용했을 때와는 달리 오전(AM)/오후(PM) 시간을 볼 수 있어 좀 더 직관적이다.

// 날짜와 시간 포맷팅 예제

// 필요한 java.time 패키지 가져오기
import java.time.*; // LocalTime 클래스를 가져오기 위함
import java.time.format.*; // DateTimeFormatter 클래스를 가져오기 위함

// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
// DateTimeFormatter 클래스를 활용하여 시간 정보 포맷팅
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
// .format()매서드로 현재 시간 포맷팅 (shortFormat 스타일 활용)
String shortFormat = formatter.format(LocalTime.now());
System.out.println(shortFormat);
}
}

>>

12:51 PM

또한 위 예제에서는 DateTimeFormatter 클래스의 shortFormat포맷으로 출력했으나 필요에 따라 여러 다른 종류의 포맷 스타일을 활용할 수 있다. 직접 형식을 지정하여 포맷팅하고 싶다면 아래와 같이 newFormatter 를 활용해 볼 수 있다. DateTimeFormatter 클래스의 ofPattern() 매서드를 활용해 원하는 포맷을 출력할 수 있다. 더 많은 포맷 스타일에 대한 정보는 아래 참조(2)에서 확인 가능하다.

// 날짜와 시간 포맷팅 예제 2

// 필요한 java.time 패키지 가져오기
import java.time.*; // LocalTime 클래스를 가져오기 위함
import java.time.format.*; // DateTimeFormatter 클래스를 가져오기 위함

// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
// newFormatter를 활용해 원하는 형식 출력하기
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String myDate = newFormatter.format(LocalDate.now());
System.out.println(myDate);
}
}

>>

2023/06/22 // "yyyy/MM/dd" 형식의 커스텀 포맷 출력

날짜 및 시간 정보를 활용한 연산

날짜와 시간을 바탕으로 계산을 해야 할 경우가 있을 수도 있다. 예를 들어서 여권은 약 4년 마다 발행을 받아야하기 때문에, 내가 여권을 발행받은 시간과 내 현재 시점을 비교하여 얼마나 지났는지를 알고 싶을 수 있다. 아래는 Period 클래스를 활용하여 between() 매서드를 통해 두 시간 시점의 차이를 계산하는 예제이다. getMonths() 매서드를 통해 월단위 시간차를, getDays() 매서드를 통해 일단위 시간차를 알 수 있다. 총 11개월 30일의 차이가 있다는 것을 알 수 있다.

// 날짜 및 시간 연산 예제
import java.time.*;

// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
LocalDate timeNow = LocalDate.now();
LocalDate timeGetPasstport = LocalDate.of(2021, 6, 23);
Period period = Period.between(timeGetPasstport, timeNow); // between()매서드로 두 시간 시점의 차 계산
System.out.println(period.getMonths()); // getMonths()매서드로 월단위 시간차 계산
System.out.println(period.getDays()); // getDays()매서드로 일단위 시간차 계산
}
}

>>

11 // getMonths()매서드로 얻은 월단위 시간차
30 // getDays()매서드로 얻은 일단위 시간차

참조:

(1) https://pixabay.com/photos/map-geography-continental-date-6784496/

(2) https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet