2014-09-08 5 views
0

나는 시간을 고칠 수없는 이유를 고집합니다. 내 서버의 시간이 엉망입니다. 사실, 일부 사이트에서 제안하는대로 "ntpdate"명령을 시도했습니다. 그러나 "date"명령은 여전히 ​​문제를 보여줍니다.시간과 시간대가 일치하지 않습니다 - Linux

자세한 내용은 내 서버가 UTC0을 사용하고 있습니다. 이것은 23:28:45를 보여줍니다. 그러나 실제로, 실시간은 16 : 31 : XX입니다. 그래서, 대략 7 시간 차이가 있습니다.

시간대 & 시간 자체가 일정하지 않기 때문에 프로그램이 깨졌습니다. 내 서비스는 Java의 Date 클래스에 의해 오늘 날짜가 표시됩니다. 그리고 "new Date()"는 서버 날짜에 따라 다릅니다.

이 차이를 해결할 방법이 있습니까? 나는 "ntpdate"를 사용하여 일부 서버와 시간을 동기화하려고 시도했다. 하지만 결코 작동하지 않습니다. 서버 컴퓨터의 하드웨어 시계에 문제가 있거나 당신은 당신을 절약 할 수 없습니다 프로그래밍, 심각한 OS 문제가

+0

[Unix 및 Linux] (http://unix.stackexchange.com) 또는 [ServerFault] (http://serverfault.com)의 StackExchange 사이트에 대한 질문과 같습니다. StackOverflow.com 사이트는 프로그래밍 관련 질문 용입니다. OS 또는 기계에 잘못된 시계 설정이있는 경우 프로그래밍의 양이 절약됩니다. –

답변

1

결함이 하드웨어 또는 OS

합니다. 같은 다른 사이트에 대한 도움말을 찾습니다

자바 날짜 - 시간 당신을 오해 할 수

인식을 있습니까 java.util의에 toString 방법이. Date와 .Calendar는 JVM의 현재 기본 시간대를 적용합니까? 실제로 날짜가없는 경우 날짜/시간 객체에 시간대가 생기는 것처럼 보입니다. 그리고이 행동은 상황에 따라 혼란 스러울 수도 있습니다.

JVM에는 운영 체제와 다를 수있는 자체 기본 표준 시간대가 있습니다. 자세한 내용은 아래를 참조하십시오.

Java가 아닌 OS 유틸리티를 사용하여 현재 날짜 시간 및 시간대/지역 설정을 확인하십시오. 하드웨어와 OS가 확실하다면 Java에 집중하십시오. 현재 날짜 시간이 당신의 OS에 정확하지만 OS가 원하지 않는 시간대로 설정되어있는 경우

은 또한 시간대를

을 원하는 지정, 당신은 당신의 자바 코드에서 해당 처리 할 수 ​​있습니다.

실제로 암시 적 기본값을 사용하지 않고 원하는/예상 시간대를 지정하는 방식으로 Java 코드를 작성해야합니다. 귀하의 경우가 그렇듯이 호스트 운영 체제가 올바른 시간대로 설정되어 있다는 것을 항상 신뢰할 수있는 것은 아닙니다. 그러면 JVM의 기본 시간대에이를 알립니다. 또한 Java 코드는 JVM의 현재 기본 시간을 변경할 수 있습니다.이 시간은 해당 JVM에서 실행되는 모든 스레드의 모든 코드에 영향을줍니다. 따라서 이는 기본적으로 의존하지 않고 시간대를 지정하는 또 다른 이유입니다.

Joda 타임은 괜찮은 날짜 - 시간 라이브러리를 사용합니다 코드에서 시간대를 지정합니다. 이는 Joda-Time 또는 Java 8의 새로운 java.time package을 의미합니다. java.util.Date 및 .Calendar 클래스는 피할 수 없으므로 사용하지 마십시오.

Joda-Time과 java.time에서 날짜 시간 클래스는 자체 지정된 시간대를 알고 있습니다. 이것은 지정된 시간대가없는 java.util.Date와는 대조적입니다.다른 시간대로 쉽게 조정할 수 있습니다.

Joda-Time과 java.time은 모두 immutable objects을 사용합니다. 여기서 객체의 값을 수정 ("변경")하지 않고 원래 객체의 속성을 기반으로 새 인스턴스를 만듭니다. 여기에는 thread-safety이 내장되어 있습니다.

// Three date-time objects, but all represent the same simultaneous moment in the timeline of the Universe. 
DateTime nowUtc = DateTime.now(DateTimeZone.UTC); 
DateTime nowParis = nowUtc.withZone(DateTimeZone.forID("Europe/Paris")); 
DateTime nowKolkata = nowUtc.withZone(DateTimeZone.forID("Asia/Kolkata")); 
+0

자세한 설명을 읽어 주셔서 감사합니다. 나는 Joda-Time도 사용하고 있습니다. java.util.data를 사용하는 이유는 "Timer"클래스를 사용하고 있기 때문입니다. Timer 클래스가 java.util.Date를 사용 중입니다. 문제는 내 랩톱 및 서버의 표준 시간대가 서로 다릅니다. 그래서, 나는 Joda-time에 의한 시차를 계산하고있다. 그런 다음 시스템 날짜 (예 : java.util.Date)를 계산합니다. 그래서 Serverside에서 정확한 시간에 타이머를 설정할 수 있습니다. 그런 다음 타이머가 랩톱 측에서 정확한 시간에 주입됩니다. – user2533493

+0

@ user2533493 문제가 단순히 서버가 워크 스테이션과 다른 시간대를 사용하는 것이라면 문제가되지 않습니다. 내 대답에서 말했듯이 시간대를 정하기보다는 시간을 지정하는 것이 가장 좋습니다. –

+0

@ user2533493 java.util.Date를 사용해야 할 때는 먼저 Joda-Time에서 모든 비즈니스 로직을 수행하십시오. 마지막으로 "toDate"를 호출하여 Joda-Time의 DateTime 객체를 다음과 같이 변환합니다. java.util.Date date = myJodaTimeDateTime.toDate();'juDate에서 Joda 로의 다른 방향 변환 -Time, 단순히 다음과 같이 Date 객체를 생성자에 전달하십시오. DateTime myJodaTimeDateTime = new DateTime (myJUDate, DateTimeZone.forID ("Europe/Paris")); ' –

관련 문제