2012-11-28 4 views
3

MST 또는 MDT 인 경우 신경 쓰지 않지만 시간이있는 LocalDateTime 개체가 있습니다 (즉, 표준 시간대 없음). 나는 MSTC 나 MDT를 추가하고, 신기원으로부터의 기원 및 밀리 세컨드가 UTC에 있기 때문에 밀리 세컨드를 얻을 수있는 DateTime 객체를 만들고 싶습니다. 물론 System.currentTimeMillis는 UTC와 같습니다.Date to LocalDateTime to DateTime jodatime을 사용하지만 시간대를 추가하는 방법

저축 시간이나 일광 절약 시간과 무관하게 MountainTime을 알 수있는 방법이 있나요? 그렇게하는 방법?

덕분에, 딘

답변

9

LocalDateTime 그냥 시민 (안 심령) 개념을 나타내는 숫자 (년, 월, 일,시, 분 ...)의 무리입니다. 날짜/시간은 물리적 개념 (시간의 순간)이며, 시간대가 추가되어 일/월/년으로 표현 될 수 있습니다.

LocalDateTime을 Datetime으로 변환하려면 표준 시간대를 지정해야합니다. 그러나이 변환은 완전히 정의되지는 않았습니다. DST 전환에서 두 개의 서로 다른 DateTimes가 동일한 LocalDateTime에 해당 할 수 있기 때문입니다.

+0

날짜와 시간이있는 경우 DateTime을 가져 오는 방법이 있습니다. MountainTime에 있지만 시간이 일광인지 표준인지는 알 수 없습니다. 코드에 따라 코드를 작성할 수 있습니다. 사양에 있지만 그것을 피하려고했습니다. –

+0

MountainTime이 시간대입니까? (저는 미국인이 아닙니다) – leonbloy

+0

산지 표준시와 산간 서머 타임 인 MST와 MDT가 있습니다. S와 D는 가을과 봄에 일어나는 모든 시간대의 변화를 나타냅니다. –

1

TL; 지금 maintenance mode에서 DR

Instant.now()          // Capture the current moment in UTC. 
     .atZone(ZoneId.of("America/Edmonton")) // Adjust from UTC to the wall-clock time in use by the people of a particular region (a time zone). 

... 또는 ...

ZonedDateTime.now(ZoneId.of("America/Edmonton")) 

java.time

Joda-Time 프로젝트는 상기 java.time 클래스 이주를 권장합니다.

를 사용하여 실시간으로 지역

MST 또는 MDT 또는 다른 3 ~ 4 자 약어를 사용하지 마십시오. 그들은 이 아니며 표준 시간대가 아니며 고유하지도 않습니다 (!).

America/Montreal, Africa/Casablanca 또는 Pacific/Auckland 같이 continent/region의 형식으로 지정 proper time zone name.

북미 센터 바로 왼쪽에있는 시간대를 의미하는 경우 America/Edmonton과 같은 의미있는 시간대를 지정하십시오. 애리조나에는 일광 절약 시간제를 결코 채택하지 않은 다른 지역이 있다는 것을 기억하십시오. 그래서 America/Phoenix을 사용합니다. UTC

자주 현명하다 UTC에서 작업 할 경우에 대한

InstantInstant 클래스를 사용합니다. Instant 클래스는 nanoseconds (소수 자릿수 9 자릿수까지)의 해상도로 UTC의 타임 라인에있는 순간을 나타냅니다.
Instant instant = Instant.now(); // Current moment in UTC. 

표준 ISO 8601 형식의 문자열을 생성하려면, toString를 호출합니다.

String output = instant.toString(); 

2016-12-06T22 : 32 : 26.773Z

신기원이 1970-01-01T00:00:00Z 이후로 1 초 단위로 계산하려면 getSeconds으로 전화하십시오.

long secondsSinceEpoch = instant.getSeconds(); 

동일한 기원 이후로 밀리 초 동안 toEpochMilli으로 전화하십시오.

long milliseconds = instant.toEpochMilli(); 

날짜 - 시간 값을 에포크 수로 처리하지 않는 것이 좋습니다. 오류가 발생하기 쉽고 디버깅하기 어렵 기 때문에 인간은 그러한 숫자의 의미를 식별 할 수 없습니다. 대신 :

  • 코드에서 java.time 객체를 사용하십시오.
  • 값을 serialize 할 때 ISO 8601 형식의 문자열을 사용하십시오.

    ZonedDateTime

ZonedDateTime을 얻기 위해 ZoneId을 적용, 지역의 시간대, 자신의 wall-clock time의 렌즈를 통해 같은 순간을 참조하십시오.

다른 방향으로가는
ZoneId z = ZoneId.of("America/Edmonton" ; 
ZonedDateTime zdt = instance.atZone(z); 

, 당신은 UTC 값에 대한 Instant을 추출 할 수 있습니다.

LocalDateTime

Instant instant = zdt.toInstant(); 
귀하의 질문은 LocalDateTime을 가지고 언급했다. Local… 클래스에는 시간대 나 오프셋 정보가 의도적으로 없습니다. 따라서 그들은 이 아니며은 타임 라인상의 한 지점을 나타냅니다.

LocalDateTime ldt = LocalDateTime.of(2016 , 1 , 23 , 12 , 34 , 56); 

ldt.toString() : 2016-01-23T12 : 34 : 56

은 실제 값에 의미를 부여하는 ZonedDateTime을 제조하는 시간대를 적용한다.

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Montreal")); 

zdt.toString() : 2016-01-23T12 : 34 : 56-05 : 00 [미국/몬트리올]

일광 절약 시간 (DST)

MountainTime이 저축 또는 일광 절약 시간과 관련이 없다고 말하는 방법은 있습니까? 그 자체로 정확한 날짜를 알고 있어야합니다.

DST 또는 기타 이러한 이상 현상에 대해 걱정할 필요가 없습니다. java.time 클래스는 자동으로이를 처리합니다. 그러나 을 사용하여 DST 중단 (시간을 얻거나 잃는 것)과 존재하지 않는 벽시계를 요구할 수있는 경우를 이해하려면 문서 클래스를 읽으십시오. 시계는 앞으로 나아 간다.).


소개 java.time은

java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이러한 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 번거로운 이전 legacy 날짜 - 시간 클래스를 대체합니다.

maintenance mode에있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

이상을 준수하는 JDBC driver을 사용하면 java.time 개체를 데이터베이스와 직접 교환 할 수 있습니다. 문자열도 java.sql. * 클래스도 필요 없습니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

  • Java SE 8, Java SE 9, 나중에
    • 내장한다.
    • 번들로 구현 된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
  • Java SE 6 및 java.time 기능의 대부분
  • Android

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.