Java 날짜 및 시간
⚡ 스마트 요약
Java 날짜 및 시간 처리는 기존의 java.util.Date 및 SimpleDateFormat 클래스와 새로 도입된 java.time API를 결합합니다. Java 8. 개발자에게 정확한 달력 작업을 위한 불변의 스레드 안전 유형을 제공합니다.

날짜와 시간을 처리하는 방법 Java 이는 일정 관리 로직, 로그 타임스탬프, 보고서 및 감사 추적을 구축하는 데 있어 일상적인 부분입니다. 코드를 작성하기 전에 날짜를 구성하는 매개변수를 아는 것이 도움이 됩니다.
- The year (두 자리 또는 네 자리 숫자로).
- The 월 (두 자리 숫자, 월 이름의 첫 세 글자 또는 월 이름 전체로 입력할 수 있습니다.)
- The 데이터 (실제 월일 숫자).
- The 일 (주어진 날짜의 요일 이름, 예: 일, 월, 화).
Java 이 함수는 시대, 연중 주차, 시간대, 오프셋 등 타임라인상의 특정 시점을 설명하는 다양한 매개변수를 보여줍니다. 아래 섹션에서는 실행 가능한 예제를 통해 각 매개변수를 자세히 설명합니다.
표시 날짜 Java
Java 를 제공합니다 Date 클래스 java.util 패키지에 포함된 클래스는 특정 시점의 시간을 밀리초 단위까지 저장하며, 해당 시점의 값을 출력, 비교, 서식 지정하는 데 도움이 되는 메서드를 제공합니다. 현재 날짜와 시간을 얻으려면 기본 생성자를 사용하여 클래스를 인스턴스화하세요.
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
출력:
Wed Nov 29 06:36:22 UTC 2017
이 예제는 날짜를 기본 toString 형식으로 출력합니다. 동일한 날짜를 다른 형식으로 표시하려면 먼저 형식 지정 문자를 이해해야 합니다. Java 사용합니다.
SimpleDateFormat: 날짜 구문 분석 및 형식 지정
The SimpleDateFormat 수업 java.text 변환 Date 객체를 형식화된 문자열로 변환하고, 형식화된 문자열을 다시 객체로 파싱합니다. Date이 기능은 날짜 또는 시간 요소에 해당하는 패턴 문자를 사용합니다. 아래 표는 지원되는 모든 문자를 나열합니다.
| 편지 | 날짜 또는 시간 구성요소 | 예시 |
|---|---|---|
| G | 연호 | AD |
| y | 출간연도 | 2026 |
| M | 연도 | 07월 또는 XNUMX월 또는 XNUMX |
| w | 연도 중 주 | 27 |
| W | 월별 주 | 2 |
| D | 일 년 중 | 189 |
| d | 월별 | 10 |
| F | 월의 요일 | 2 |
| E | 주의 요일 이름 | 화요일 또는 화요일 |
| u | 주의 요일 수(1 = Monday, 7 = 일요일) | 1 |
| a | 오전 또는 오후 표시 | PM |
| H | 하루 중 시간(0-23) | 0 |
| k | 하루 중 시간(1-24) | 24 |
| K | 오전 또는 오후 시간 (0-11) | 0 |
| h | 오전 또는 오후 시간 (1-12) | 12 |
| m | 분 | 30 |
| s | 초 | 55 |
| S | 밀리 초 | 978 |
| z | 시간대 (이름) | 태평양 표준시; 태평양 표준시; GMT-08:00 |
| Z | 시간대(RFC 822 오프셋) | -0800 |
| X | 시간대(ISO 8601 오프셋) | -08 또는 -0800 또는 -08:00 |
표 전체를 외울 필요는 없습니다. 새로운 패턴을 만들 때마다 표를 참조하세요.
SimpleDateFormat 사용 방법
SimpleDateFormat 의 하위 클래스입니다 DateFormat 위의 패턴 문자를 사용하여 날짜 형식을 지정하고 구문 분석할 수 있습니다. 원하는 문자열을 생성하거나 읽으려면 문자를 조합하십시오.
예 :
- 날짜 형식 필수: 2012.10.23년 20월 20일 45:XNUMX:XNUMX PST적절한 형식 패턴은 다음과 같습니다.
yyyy.MM.dd HH:mm:ss zzz. - 날짜 형식 필수: 09:30:00 AM 23-May-2012적절한 형식 패턴은 다음과 같습니다.
hh:mm:ss a dd-MMM-yyyy.
Tip 시계 글자 대소문자. 대문자 M 월, 소문자 m 분입니다. 대문자 H 24시간 시계, 소문자 h 12시간제 시계입니다. 이 둘을 혼동하면 오류 메시지 없이 잘못된 결과가 출력됩니다.
아래 프로그램은 현재 날짜를 기본 형식으로 한 번, SimpleDateFormat 패턴을 사용하여 한 번, 총 두 번 출력합니다.
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
출력:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
날짜 비교 예
두 개를 주문하는 가장 확실한 방법 Date 객체는 compareTo() 이 메서드는 호출자가 먼저 날짜를 지정하면 음의 정수를, 두 날짜가 같으면 0을, 호출자가 나중에 날짜를 지정하면 양의 정수를 반환합니다. 아래 코드 조각은 두 개의 날짜 문자열을 파싱하여 상대적인 순서를 출력합니다.
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
출력:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
참고 : 원래 코드는 패턴을 사용했습니다. dd-mm-yyyy. 소문자 mm 문자는 분을 나타내는 것이지 월을 나타내는 것이 아니므로 파서가 잘못된 월 값을 출력했습니다. 위의 수정 사항은 대문자를 사용합니다. MM 월을 나타내는 글자는 올바른 패턴 문자입니다.
Java 8. 최신 날짜 및 시간 API(java.time)
Java 8은 다음을 소개했습니다. java.time Joda-Time 라이브러리에서 영감을 받아 재설계된 API를 제공하는 패키지입니다. 새로운 클래스는 불변이며 스레드에 안전하고, 사람의 달력과 기계의 시간표를 분리합니다. 가장 일반적인 유형은 다음과 같습니다.
LocalDate시간이나 시간대가 없는 날짜(예: 생일)의 경우.LocalTime날짜나 시간대를 표시하지 않는 벽시계 시간입니다.LocalDateTime시간대를 제외한 날짜와 시간을 입력하려면.ZonedDateTime특정 시간대를 포함한 날짜와 시간을 입력하세요.OffsetDateTimeUTC 오프셋은 있지만 이름이 지정된 영역이 없는 날짜 및 시간입니다.InstantUNIX 에포크를 기준으로 측정된 머신 타임스탬프의 경우입니다.DurationPeriod시간 기반 금액 및 날짜 기반 금액의 경우.
아래 예시는 최신 API를 사용하여 현재 날짜, 시간, 타임스탬프 및 시간대를 출력합니다.
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
각 유형에는 팩토리 메서드가 있습니다(now, of, parse) 및 불변 연산(plusDays, minusHours, withYear원본 객체를 변경하는 대신 새로운 값을 반환하는 메서드입니다.
DateTimeFormatter: 최신 날짜 형식 지정 Java
DateTimeFormatter in java.time.format 대체 SimpleDateFormat이 클래스는 동일한 스타일의 패턴 문자를 사용하고, 불변이며, 추가적인 동기화 없이 스레드 간에 안전하게 공유할 수 있습니다. 또한 다음과 같은 미리 만들어진 상수를 제공합니다. ISO_LOCAL_DATE ISO_ZONED_DATE_TIME 표준 형식의 경우.
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
최신 API에서 두 날짜를 비교하려면 다음 함수를 호출하세요. isBefore, isAfter및 isEqual이러한 방법들은 보다 명확하게 읽힙니다. compareTo 그리고 모든 사람과 함께 일합니다 java.time 클래스입니다.
스레드 안전성과 모범 사례 Java 날짜 및 시간
모두 java.util.Date SimpleDateFormat 현대 동시대보다 앞선다 Java각각 알려진 문제점이 있습니다. 프로덕션 코드에서 날짜 처리를 올바르게 유지하려면 아래의 지침을 따르십시오.
- Date와 Calendar 대신 java.time을 사용하는 것이 좋습니다. 새로운 데이터 유형은 불변이며 스레드로부터 안전하고, 도메인을 더욱 정확하게 모델링합니다(시간 정보가 없는 날짜, 시간대 정보가 없는 시간 등).
- SimpleDateFormat을 스레드 간에 공유하지 마십시오. 해당 클래스는 내부 구문 분석 상태를 저장하며 스레드로부터 안전하지 않습니다. 스레드로 감싸주세요.
ThreadLocal인스턴스에서 동기화하거나 전환하세요.DateTimeFormatter. - 항상 로케일을 지정하십시오. 월과 일 이름은 JVM의 기본 로케일에 따라 변경되므로 다음과 같은 패턴이 생깁니다.
MMMEEE이식성이 떨어집니다. 로케일을 명시적으로 전달하세요(예:Locale.ENGLISH). - 시간대를 명확하게 명시하세요.
LocalDateTime해당 영역이 없으므로 변환합니다.ZonedDateTimeorInstant특히 로그, 데이터베이스 열, 네트워크 페이로드의 경우 정확한 순간이 중요할 때 그렇습니다. - 두 API 간 변환 시 주의하십시오.
date.toInstant(),Date.from(instant)예산 및calendar.toInstant().atZone(zone)기존 코드와 최신 코드의 경계에서. - 타임스탬프를 UTC로 저장합니다. 끈기 있게 노력하세요 transmit UTC 기준 날짜 (
Instant또는 ISO 8601 문자열)을 사용자 영역에 맞게 변환하여 표시할 때만 변환합니다.


