tl; dr
호스트 컴퓨터에서 시스템 시계를 수동으로 변경하는 것 외에 System.currentTimeMillis를 통해 표시되는 현재 시간을 코드 또는 JVM 인수로 사용하여 현재 시간을 재정의하는 방법이 있습니까?
예.
Instant.now(
Clock.fixed(
Instant.parse( "2016-01-23T12:34:56Z"), ZoneOffset.UTC
)
)
Clock
java.time에서
가짜 날짜-시간 값으로 테스트를 용이하게하기 위해 플러그 가능 클록 교체 문제에 대한 새로운 솔루션이 있습니다. java.time 패키지 에서 자바 (8)는 추상 클래스 포함 java.time.Clock
명시 적 목적을 :
필요에 따라 대체 클럭을 연결할 수 있도록
의 구현을 꽂을 수 Clock
있지만 필요에 맞게 이미 구현 된 것을 찾을 수도 있습니다. 편의상 java.time에는 특수 구현을 생성하는 정적 메소드가 포함되어 있습니다. 이러한 대체 구현은 테스트 중에 유용 할 수 있습니다.
변경된 케이던스
다양한 tick…
방법은 다른 케이던스로 현재 순간을 증가시키는 클럭을 생성합니다.
기본값 은 하드웨어에 따라 Java 8 및 Java 9에서 밀리 초 단위 로 나노초 단위 로 Clock
업데이트 된 시간을보고합니다 . 실제 현재 모멘트를 다른 세분성으로보고하도록 요청할 수 있습니다.
거짓 시계
일부 클럭은 거짓말로 인해 호스트 OS의 하드웨어 클럭과 다른 결과를 생성 할 수 있습니다.
예를 들어, 올해 초 크리스마스 첫 순간에 잠그십시오. 다시 말해서 산타와 그의 순록이 처음으로 멈출 때 . 요즘 가장 빠른 시간대 Pacific/Kiritimati
는 +14:00
입니다.
LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate xmasThisYear = MonthDay.of( Month.DECEMBER , 25 ).atYear( ld.getYear() );
ZoneId earliestXmasZone = ZoneId.of( "Pacific/Kiritimati" ) ;
ZonedDateTime zdtEarliestXmasThisYear = xmasThisYear.atStartOfDay( earliestXmasZone );
Instant instantEarliestXmasThisYear = zdtEarliestXmasThisYear.toInstant();
Clock clockEarliestXmasThisYear = Clock.fixed( instantEarliestXmasThisYear , earliestXmasZone );
항상 같은 순간을 반환하려면 특수 고정 시계를 사용하십시오. 우리는 Kiritimati 에서 크리스마스의 첫 순간을 맞이합니다. UTC 는 12 월 24 일 전일 오전 10 시보 다 일찍 14 시간 일찍 벽시계 시간 을 표시합니다 .
Instant instant = Instant.now( clockEarliestXmasThisYear );
ZonedDateTime zdt = ZonedDateTime.now( clockEarliestXmasThisYear );
instant.toString () : 2016-12-24T10 : 00 : 00Z
zdt.toString () : 2016-12-25T00 : 00 + 14 : 00 [태평양 / 키리 마티]
IdeOne.com의 라이브 코드를 참조하십시오 .
실제 시간, 다른 시간대
Clock
구현에서 할당 한 시간대를 제어 할 수 있습니다 . 이것은 일부 테스트에 유용 할 수 있습니다. 그러나 프로덕션 코드에서는 항상 선택 사항 ZoneId
또는 ZoneOffset
인수를 명시 적으로 지정 해야하는 것이 좋습니다 .
UTC를 기본 영역으로 지정할 수 있습니다.
ZonedDateTime zdtClockSystemUTC = ZonedDateTime.now ( Clock.systemUTC () );
특정 시간대를 지정할 수 있습니다. 지정 적절한 시간대 이름 의 형식 continent/region
예컨대, America/Montreal
, Africa/Casablanca
, 또는 Pacific/Auckland
. 표준 시간대 가 아니EST
거나 표준화되지 않았으며 고유하지 않은 3-4 문자 약어를 사용하지 마십시오 .IST
ZonedDateTime zdtClockSystem = ZonedDateTime.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
JVM의 현재 기본 시간대를 특정 Clock
오브젝트 의 기본값으로 지정할 수 있습니다 .
ZonedDateTime zdtClockSystemDefaultZone = ZonedDateTime.now ( Clock.systemDefaultZone () );
이 코드를 실행하여 비교하십시오. 그것들은 모두 타임 라인에서 같은 시점, 같은 시점을보고합니다. 그것들은 벽시계 시간 에서만 다릅니다 . 다시 말해, 같은 것을 말하는 세 가지 방법, 같은 순간을 나타내는 세 가지 방법.
System.out.println ( "zdtClockSystemUTC.toString(): " + zdtClockSystemUTC );
System.out.println ( "zdtClockSystem.toString(): " + zdtClockSystem );
System.out.println ( "zdtClockSystemDefaultZone.toString(): " + zdtClockSystemDefaultZone );
America/Los_Angeles
이 코드를 실행 한 컴퓨터의 JVM 현재 기본 영역입니다.
zdtClockSystemUTC.toString () : 2016-12-31T20 : 52 : 39.688Z
zdtClockSystem.toString () : 2016-12-31T15 : 52 : 39.750-05 : 00 [미국 / 몬트리올]
zdtClockSystemDefaultZone.toString () : 2016-12-31T12 : 52 : 39.762-08 : 00 [미국 / 로스 앤젤레스]
Instant
클래스는 정의에 의해 UTC 항상. 따라서이 세 가지 영역 관련 Clock
사용법은 동일한 효과를 갖습니다.
Instant instantClockSystemUTC = Instant.now ( Clock.systemUTC () );
Instant instantClockSystem = Instant.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
Instant instantClockSystemDefaultZone = Instant.now ( Clock.systemDefaultZone () );
instantClockSystemUTC.toString () : 2016-12-31T20 : 52 : 39.763Z
instantClockSystem.toString () : 2016-12-31T20 : 52 : 39.763Z
instantClockSystemDefaultZone.toString () : 2016-12-31T20 : 52 : 39.763Z
기본 시계
에 기본적으로 사용되는 구현 Instant.now
은에서 반환 된 구현 Clock.systemUTC()
입니다. 이것은를 지정하지 않을 때 사용되는 구현 Clock
입니다. 시험판 Java 9 소스 코드를Instant.now
참조하십시오 .
public static Instant now() {
return Clock.systemUTC().instant();
}
기본 Clock
에 OffsetDateTime.now
와 ZonedDateTime.now
있다 Clock.systemDefaultZone()
. 소스 코드를 참조하십시오 .
public static ZonedDateTime now() {
return now(Clock.systemDefaultZone());
}
기본 구현의 동작은 Java 8과 Java 9 사이에서 변경되었습니다. Java 8 에서 클래스의 나노초 분해능 저장 기능에도 불구하고 현재 순간은 밀리 초 단위 의 해상도로 캡처됩니다 . Java 9는 물론 컴퓨터 하드웨어 시계의 기능에 따라 나노초의 해상도로 현재 순간을 캡처 할 수있는 새로운 구현을 제공합니다.
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 . Hibernate 5 & JPA 2.2는 java.time을 지원 합니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?