원본 : http://it.deepinmind.com/java/2015/03/17/20-20-20-20-from-java8.html
Lambda 표현, 스트림 및 몇 가지 작은 개선 사항 외에도 Java 8 은이 자습서에서 새로운 시간과 날짜 API를 도입했습니다. Java의 날짜, 캘린더 및 시간 처리는 항상 비판을 받았으며, 특히 Java.util.date를 수정 된 것으로 정의하고 SimpledateFormat를 비 스레드 보안으로 사용하기로 결정했습니다. Java는 시간 및 날짜 기능에 대한 더 나은 지원을 제공해야한다는 것을 깨달았으며, 이는 Joda Time 데이터베이스 사용에 익숙한 커뮤니티에도 좋습니다. 이 새로운 시간 및 날짜 라이브러리의 가장 큰 장점은 예를 들어 순간 시간, 기간, 날짜, 시간 (시간), 시간대 (시간 영역)와 같은 일부 개념을 정의한다는 것입니다. 그리고 기간. 동시에, 그것은 또한 시간 날짜를 구별하기 위해 사람과 기계를 구별하는 것과 같은 Joda 라이브러리의 몇 가지 장점을 빌립니다. Java 8은 여전히 ISO 캘린더 시스템을 사용하며 전임자와 달리 Java.Time 패키지의 클래스는 의심 할 여지가 없으며 스레드 -안전합니다. 새로운 Time and Date API는 Java.Time 패키지에 있습니다.
새로운 라이브러리는 또한 ZoneOffset과 Zoned를 추가하여 시간대를 더 잘 지원합니다. 새로운 DateTimeFormatter를 사용하면 날짜 이후 날짜의 분석 및 형식이 새로워졌습니다. 그냥 언급하면, 나는 Java가 현재이 새로운 기능을 시작하려고했을 때이 기사를 작성하고 있었기 때문에 예제의 시간이 작년에 있음을 알게 될 것입니다. 이 예제를 실행하면 반환 값이 정확해야합니다.
누군가 새로운 도서관을 배우는 가장 좋은 방법은 무엇입니까? 내 대답은 실제 프로젝트에서 사용하는 것입니다. 실제 프로젝트에는 다양한 요구가있어 개발자 가이 새로운 도서관을 탐색하고 연구하도록 촉진 할 것입니다. 요컨대, 과제 자체만이 실제로 탐험하고 배우도록 촉진 할 것입니다. Java 8의 새로운 날짜와 시간 API는 동일합니다. 이 새로운 Java 8의 라이브러리를 배우기 위해 여기서 20 개의 작업 중심 예제를 만들었습니다. 예를 들어, Java 8의 시간 및 날짜 라이브러리를 오늘 표현한 다음 시간대와 함께 완전한 날짜를 더 생성 한 다음 더 실용적인 작업을 완료하는 방법을 연구하는 방법으로 시작하겠습니다. 생일, 일요일 기념일, 다음 계정 날짜, 다음 프리미엄 날짜 또는 신용 카드 만료 시간과 같은 특정 날짜를 찾기 위해 알림 신청을 개발한다고 말합니다.
Java 8에는 LocalDate라는 클래스가 있으며 오늘날의 날짜를 나타낼 수 있습니다. 이 클래스는 날짜 만 포함하고 시간이 없기 때문에 java.util.date와 약간 다릅니다. 따라서 시간 대신 날짜 만 표시하면됩니다. 사용하면 사용할 수 있습니다.
LocalDate = LocalDate.now ();
오늘날 생성하지만 시간 정보는 포함되어 있지 않다는 것을 알 수 있습니다. 또한 날짜 형식을 형성하고 이전 날짜 클래스와 달리 인쇄 된 데이터가 형식화되지 않습니다.
LocalDate 클래스는 추출하는 데 사용할 수있는 날짜 및 기타 날짜 속성을 사용하는 매우 편리한 방법을 제공합니다. 이 방법을 사용하면 필요한 날짜 속성을 얻을 수 있으며 더 이상 java.util.calendar와 같은 클래스를 사용할 필요가 없습니다.
LocalDate = LocalDate.NOW () int Month = int ut.printf (); 연도, 월, 일);
Java 8에서 연간 정보를 얻는 것은 매우 간단하다는 것을 알 수 있습니다. 해당 Getter 방법, 메모리, 매우 직관적 인 방법 만 사용하면됩니다. Java의 현재 월 및 일의 글쓰기와 비교할 수 있습니다.
첫 번째 예에서는 정적 방법을 통해 하루의 날짜를 생성하는 것이 매우 간단하지만, 또 다른 매우 유용한 공장 방법 LocalDate.of ()를 통해 날짜를 수락 할 수 있습니다 해, 달, 그리고 동등한 LocalDate 인스턴스를 반환합니다. 이 방법에 대한 또 다른 좋은 소식은 예를 들어 API에서 실수를하지 않았다는 것입니다. 예를 들어, 다음 예에서는 여기에 쓴 내용입니다. 예를 들어, 1 월 14 일을 나타내며 숨겨진 논리는 없습니다.
localdate dateofbirth = localdate.of (2010, 01, 14)
창조 된 날짜는 2014 년 1 월 14 일 우리가 쓰는 것임을 알 수 있습니다.
실제로 실제 처리 시간과 날짜 작업에 대해 말하면, 하나는 두 날짜가 동일인지 확인하는 것이 일반적입니다. 오늘날이 생일, 기념일 또는 휴일과 같은 특별한 날인지 판단할지 여부를 종종 만날 수 있습니다. 때로는 특정 날인지 확인할 수 있도록 날짜를 줄 것입니다. 다음 예는 Java 8에서 이러한 작업을 완료하는 데 도움이됩니다. 생각하면서 LocalDate는 다음과 같이 날짜를 비교하기 위해 Equals 메소드를 다시 작성했습니다.
LocalDate Date1 = LocalDate.of (2014, 01, 14); 2014-01-14 및 날짜 1 2014-01-14는 같은 날짜입니다
이 예에서 비교 두 날짜는 동일합니다. 동시에, 코드에서 형식화 된 날짜 문자열을 가져 오면 비교하기 전에 날짜로 해결해야합니다. 이 예제를 비교하여 이전에 Java의 비교를 비교할 수 있으며 훨씬 더 나은 것을 알 수 있습니다.
Java의 시간 날짜와 관련하여 중복 행사, 예를 들어 월간 청구일, 결혼 기념일, 월간 상환 날짜 또는 연간 보험료를 확인하는 실질적인 작업도 있습니다. 전자 상거래 회사에서 일한다면, 생일 소원을 사용자에게 보내고 크리스마스, 추수 감사절과 같은 각 중요한 휴일에 인사를 할 수있는 모듈이있을 것입니다 Deepawali입니다. Java에서 축제인지 반복 사건인지 판단하는 방법은 무엇입니까? Monthday 클래스를 사용하십시오. 이 범주는이 달에 결합되며 연간 정보가 포함되어 있지 않으므로 매년 반복되는 일부 일을 나타낼 수 있습니다. 물론, 연말 수업과 같은 다른 조합이 있습니다. 또한 New Time 라이브러리의 다른 유형으로 안전하게 변경하고 스레드를 변경할 수 없으며 가치 클래스이기도합니다. 중복 날짜를 확인하기 위해 월요일 사용 방법을 살펴 보겠습니다.
DTEALDAY 생일 (2010, 01, 14); println ( "오늘의 많은 행복한 귀환 !!");
올해는 다르지만 오늘은 생일의 날이므로 생일 축복을 보게 될 것입니다. 시스템 시간을 조정하고 다음 생일이있을 때 상기시켜 줄 수 있는지 확인할 수 있습니다.
이것은 첫 번째 예제의 현재 날짜와 매우 유사합니다. 이번에는 LocalTime이라는 클래스를 사용합니다. 날짜가없는 시간이며 LocalDate에 가깝습니다. 여기에서 정적 공장 메소드를 사용하여 현재 시간을 얻을 수 있습니다. 기본 형식은 HH : MM : SS : NNN이고 여기의 NNN은 나노초입니다. Java 8으로 현재 시간을 얻는 방법과 비교할 수 있습니다.
localtime = localtime.now (); "현지 시간 :"출력 현지 시간;
LocalTime에는 시간과 날짜가 없기 때문에 현재 시간에는 날짜가 포함되어 있지 않다는 것을 알 수 있습니다.
여러 번 우리는 1 분 또는 두 번째마다 미래 시간을 늘려야합니다. Java 8은 변경되지 않은 및 스레드 -Safe 클래스를 제공 할뿐만 아니라 Plushours ()와 같은 몇 가지 편리한 방법을 제공하여 원래 Add () 메소드를 대체합니다. 그건 그렇고, 이러한 방법은 LocalTime이 불변이기 때문에 새로운 LocalTime 인스턴스에 대한 참조를 반환합니다.이 새로운 참조를 저장하는 것을 잊지 마십시오.
localtime = localtime.now (); 2 시간 추가 시스템 (2 시간 후); : 33.369
현재 시간의 2 시간 후에는 16 : 33 : 33.369임을 알 수 있습니다. 이제 Java의 이전 방식을 추가하거나 줄이기 위해 이전 방법과 비교할 수 있습니다. 언뜻보기에, 당신은 어느 길이 더 나은지 알고 있습니다.
이것은 이전 2 시간의 이전 예와 유사합니다. LocalDate는 시간이없는 날짜를 나타내는 데 사용됩니다. 플러스 () 방법은 낮, 주 또는 월을 늘릴 수 있으며 시간 단위를 나타내는 데 사용됩니다. LocalDate도 불변이기 때문에 모든 수정 작업은 새로운 예제를 반환 할 것이므로 저장하는 것을 잊지 마십시오.
LocalDate Nextweek = Plus (1, Chronounit.weeks.out.println); IS : 1 주일 이후 2014-01-14 날짜 : 2014-01-21
7 일 후 날짜가 무엇인지 알 수 있습니다. 이 방법을 사용하여 1 개월, 1 년, 1 시간, 1 분 또는 10 년을 늘리고 Java API의 크로노 니트 클래스를 확인하여 더 많은 옵션을 얻을 수 있습니다.
이것은 이전 예제의 속편입니다. 위의 예에서는 LocalDate의 Plus () 메소드를 사용하여 날짜, 주 또는 월을 늘리는 방법을 배웠습니다.
LocalDate previousyear = minus (1, chronousit.years). " + nextyear); 출력 : 1 년 전 날짜 : 2013-01-14 1 년 후 날짜 : 2015-01-14
총 2 년, 하나는 2013이고, 다른 하나는 2015 년이라는 것을 알 수 있습니다. 2015 년은 2014 년 전후의 해입니다.
Java 8은 시계 클래스와 함께 제공되며, 특정 시간대에서 현재 순간 시간, 날짜 또는 시간을 얻는 데 사용할 수 있습니다. 시계를 사용하여 System.CurrentTimeInmillis () 및 TimeZone.getDefault () 메소드를 대체 할 수 있습니다.
// 시스템 시계를 기준으로 현재 시간을 반환하고 clock.systemutc (). .SystemDefaultZone (); "Clock :" + Clock);
지정된 날짜를 사용하여 다음과 같이이 시계와 비교할 수 있습니다.
public class myclass {private clock clock; // public void process (localDate eventDate) {if (eventDate.isbefore (c lock)) {...}}}다른 시간대의 날짜를 다루어야한다면 매우 편리합니다.
이것은 또한 실제 프로젝트에서 일반적인 작업입니다. 특정 날짜가 다른 날짜 앞에 있는지 또는 그 뒤에 있는지 여부를 어떻게 판단합니까? Java 8에서, LocalDate 클래스에는 isbefore () 및 isafter () 메소드가 두 날짜를 비교하는 데 사용할 수 있습니다. 통화 방법의 날짜가 주어진 날짜보다 빠른 경우 isbefore () 메소드가 true를 반환합니다.
localdate tomomorrow = localdate.of (2014, 1, 15); 어제 (오늘) {시스템Java 8의 날짜는 비교적 간단하다는 것을 알 수 있습니다. 캘린더와 같은 다른 클래스를 사용하여 유사한 작업을 완료 할 필요가 없습니다.
Java 8은 날짜와 시간뿐만 아니라 때로는 지역을 분리합니다. 예를 들어 시간대와 관련된 여러 그룹이 있으며, 구역은 특정 시간대를 나타냅니다. Java 8 이전의 Gregoriancalendar 클래스와 동일합니다. 이 클래스를 사용하면 다음 예제와 같은 다른 시간대의 해당 시간으로 현지 시간을 변환 할 수 있습니다.
// Java 8 Zava의 날짜 및 시간 Zoneid America = Zoneid.of ( "American/News"); TimeZone : " + DateAndTimeInnewyork); 출력 : 특정 시간대의 현재 날짜 및 시간 : 2014-01-14T16 : 33.373-05 : 00 [American/New_York]
현지 시간을 GMT 시간으로 변환하는 시간과 비교할 수 있습니다. 그건 그렇고, Java 8 이전과 마찬가지로 해당 시간대의 텍스트를 착각해서는 안됩니다. 그렇지 않으면 그러한 예외가 발생합니다.
스레드 예외 "main"java.time.zone.zonerseexception : java.time.zone.zonerulesprovider.getrules의 java.time.zonerulesprovider.getrules (java.time.zoneerulesprovider.getrules)의 java.time.zonerulesprovider.getrules의 아시아/도쿄. time.zoneregy.ofid (java.time.zoneid.of (Zava.time.zoneid.of)의 java.time.zoneid.of (zava.time.zoneid.of)
Monthday가 중복의 날을 표현하는 것처럼, 연말은 신용 카드 상환 날짜, 정기 예금 만기 날짜 및 옵션 만료 날짜를 나타냅니다. 이 클래스를 사용하여 그 달의 날을 찾을 수 있습니다.이 방법은 올해의 일일 인스턴스가 며칠을 반환합니다. 이는 2 월 28 일인지 29 일인지 확인하는 데 매우 유용합니다.
연말 CurrentYearmonth = Year Month.now (); ; ""귀하의 신용 카드는 %s %n 만료 ", 신용 카드를 제공합니다.
이것은 복잡하지 않습니다. LocalDate 클래스에는 현재 지역 운영자에 해당하는 연도가 도약인지 여부를 반환 할 수있는 isleapyear () 방법이 있습니다. 여전히 휠을 반복하고 싶다면이 코드를 볼 수 있습니다.
if (Today.isleapyear ()) {System.out.println ( "올해는 도약");몇 년 동안 결과가 올바른지 확인할 수 있습니다.
또 다른 일반적인 작업은 주어진 두 날짜 사이에 며칠 또는 몇 주 또는 몇 년이 포함되어 있는지 계산하는 것입니다. Java.Time을 사용 하여이 기능을 완료 할 수 있습니다. 다음 예에서는 현재 날짜와 미래 날짜 전 총 몇 개월을 계산합니다.
LocalDate Java8Release = LocalDate.of (2014, Month.march, 14); )); 출력 : 오늘과 Java 8 사이의 릴리스 : 2
이번 달은 1 월이고 Java 8의 출시일은 3 월이므로 2 개월 간격이라는 것을 알 수 있습니다.
Java 8에서는 ZoneOffset 클래스를 사용하여 특정 시간대를 나타냅니다. 인도는 GMT 또는 UTC5 : 30입니다. 이 오프셋을 얻는 한 LocalDateTime 과이 오프셋을 사용하여 공무원을 생성 할 수 있습니다.
LocalDaleTime = LocalDateMe.of (2014 년, 14, 19, 30); .println ( "Java에서 시간대 오프셋이있는 날짜 및 시간 :" + 날짜);
현재 날짜는 시간대와 관련이 있음을 알 수 있습니다. 또 다른 요점은 OfficetDateTime이 주로 기계에 의해 이해된다는 것입니다.
Java 8 이전에 현재 타임 스탬프를 얻는 방법을 여전히 기억한다면, 이것은 단순히 작은 요리입니다. 인스턴트 클래스에는 다음과 같이 현재 타임 스탬프를 반환 할 정적 공장 메소드가 있습니다.
Instant timestamp = instant.now ();
현재 타임 스탬프에는 날짜와 시간이 포함되어 있으며, 이는 Java.util.date와 유사하다는 것을 알 수 있습니다. java.util.date로, 날짜.
Java 8 이전에는 시간 날짜의 서식이 기술적 인 작업입니다. 스레드의 로컬 변수 덕분에 다중 스레드 환경에서 유용했지만 Java 가이 상태를 유지하는 데 오랜 시간이 걸렸습니다. 이번에는 새로운 스레드 보안 날짜 및 시간 형식을 도입했습니다. 또한 일반적으로 사용되는 날짜 형식을 포함하는 일부 미리 정해진 형식이 제공됩니다. 예를 들어,이 예에서는 2014 년 2 월 14 일부터 20140114 년까지 포맷 될 사전 정의 된 기본 ISO 날짜 형식을 사용합니다.
String DayaFtertommork = "20140116"; -16
생성 날짜는 지정된 문자열의 값과 일치하는 것을 알 수 있으며, 이는 날짜 형식에서 약간 다릅니다.
위의 예에서는 내장 시간 및 날짜 형식을 사용하여 날짜 문자열을 해결했습니다. 물론 미리 정해진 형식은 실제로 좋지만 때로는 사용자 정의 날짜 형식을 사용해야 할 수도 있습니다. 이 예제의 날짜 형식은 "mmm dd yyyy"입니다. ofpattern static method ()를 dateTimeFormatter의 pattern static method ()로 전달할 수 있으며,이 모드의 문자 그대로의 양은 앞의 예제와 동일합니다. 예를 들어, M은 여전히 달을 나타내고 M은 여전히 분열되어 있습니다. 유효하지 않은 모드는 DateTimeParseException 이상을 던지지 만 논리적 오류 인 경우 M은 m으로 사용되어야하므로 방법이 없습니다.
goodfriday = "2014 년 4 월 18 일"; ", goodfriday, holiday);} catch (dateTimeparsexception ex) {System.out.printf ("%s는 parsable!%n ", good -friday); ex.printstacktr asce ();} 출력 : 2014 년 4 월 18 일에 연속적으로 구문 분석됩니다. , 날짜는 2014-04-18입니다날짜의 값은 실제로 통과 문자열과 일치하지만 형식은 다르다는 것을 알 수 있습니다.
이전 두 예제에서는 DateTimeFormatter 클래스를 사용했지만 주로 날짜 문자열을 구문 분석했습니다. 이 예에서 우리가해야 할 일은 정확히 반대입니다. 여기에 LocalDateTime 클래스의 인스턴스가 있으며,이를 형식의 날짜 문자열로 변환하려고합니다. 이것은 지금까지 날짜를 Java의 문자열로 변환하는 가장 간단하고 편리한 방법입니다. 다음 예제는 형식화 된 문자열을 반환합니다. 이전 예제와 마찬가지로 지정된 모드 문자열을 사용하여 DateTimeFormatter 클래스의 인스턴스를 만들어야하지만 LocalDate 클래스의 구문 분석 메소드는 형식 () 메소드가 아닙니다. 이 메소드는 현재 날짜를 나타내는 문자열을 반환하고 해당 모드는 도입 된 DateTimeFormatter 인스턴스에 정의 된 모드입니다.
LocalDaleTime ArrivalDate = LocalDateTime.now (); {dateTimeFormatter 형식 = dateTimeFormath.OfPatter rrivaldate.out.out.printf (도착 : % s % n "); System.out.printf ( "%s는 포맷 할 수 없습니다!%n", arrivaldate);현재 시간은 "MMM DD YYYY HH : MM A"모드로 표현한다는 것을 알 수 있습니다.
이 예제를 읽은 후, 나는 당신이 Java 8의 새로운 시간과 날짜에 대한 확실한 이해를 가지고 있다고 생각합니다. 이제 우리는이 새로운 API의 핵심 요소 중 일부를 되돌아 봅니다.
각 Java 개발자는 최소한이 새로운 API의 5 가지 범주를 이해해야합니다.
이 라이브러리의 메인 백은 Java.Time이며, 여기에는 수업, 시간, 순간 및 대표 날짜, 시간, 시간, 순간 및 기간이 포함되어 있습니다. 두 개의 서브 포장이 있습니다. 하나는 java.time.foramt이며, 다른 하나는 java.time.tembages입니다.
시간대는 지구상에서 동일한 표준 시간을 공유하는 지역을 말합니다. 각 시간대에는 고유 식별자와 지역/도시 (아시아/도쿄)의 형식과 그리니치 시간부터 시작하는 오프셋 시간이 있습니다. 예를 들어, 도쿄의 오프셋 시간은 +09 : 00입니다.
OfficedateTime 클래스에는 실제로 LocalDateTime 및 ZoneOffset이 포함됩니다. Greenwita의 시간 오프셋을 포함하는 완전한 날짜 (+/- 시간 : +06 : 00 또는 -08 : 00)를 표시하는 데 사용됩니다
DateTimeFormatter 클래스는 Java의 날짜의 서식 및 분석에 사용됩니다. SimpledateFormat과 달리 변경되지 않고 필요한 경우 정적 변수에 할당 할 수 있습니다. DateTimeFormatter 클래스는 사전 정의 된 많은 형식을 제공하며 원하는 형식을 사용자 정의 할 수도 있습니다. 물론 계약에 따르면 문자열을 날짜로 변환하는 구문 분석 () 메소드도 변환 기간 동안 오류가 발생하면 DateTimeParsexception 이상을 버립니다. 마찬가지로 DateFormatter 클래스에는 형식이 잘못되면 DateTimeexception이 표시됩니다.
"mmm d yyyy"와 "mmm dd yyyy"의 두 날짜 형식도 약간 다릅니다. "2014 년 1 월 2 일"에서는 두 문자가 달에 통과 될 것으로 예상되므로 오류를보고합니다. 이 문제를 해결하려면 숫자 수의 경우 "2014 년 1 월 2 일"과 같은 0을 구성해야합니다.
이것은 Java 8의 새로운 시간 날짜에 관한 것입니다. 이 간단한 예는이 새로운 API의 새로운 API를 이해하기에 충분합니다. 실제 작업에 따라 설명되므로 Java에서 발생할 때 시간과 날짜를 찾을 필요는 없습니다. 우리는 시간 날짜를 생성하고 수정하는 방법을 배웠습니다. 또한 순수한 날짜, 시간 및 시간대의 시간대의 차이점을 이해합니다. 기념일이나 보험 일에 며칠이 있습니다. 또한 스레드 로컬 변수 또는 세 번째 파티 라이브러리를 사용하지 않고 Java 8의 스레드 보안 방법에서 날짜를 분석하고 형식화하는 방법을 배웠습니다. 새로운 API는 시간 날짜와 관련된 모든 작업에 유능합니다.
Java 8 튜토리얼에도 관심이 있으시면 다음 자습서를 살펴볼 수 있습니다.
영어 원본 링크