Joda 시간에서 시간을 변경하지 않고 시간대를 변환하는 방법
JodaTime DateTime
인스턴스 로 설정중인 데이터베이스에서 UTC 타임 스탬프를 받고 있습니다.
DateTime dt = new DateTime(timestamp.getTime());
시간을 완벽하게 저장 10:00 AM
하지만 현지 시간대로 저장합니다 . 예 : UTC에서 +5 : 30 인 IST 시간대에 있습니다.
나는 시간대를 변경하기 위해 많은 것을 시도했지만 모든 10:00 AM
것에서 +5 : 30 차이를 사용하여 시간을 다른 것으로 변경합니다 .
현재 시간에 영향을주지 않고 TimeZone을 변경할 수있는 방법이 있습니까?
편집 : 현재 시간이 다음과 같은 경우 :
2013-09-25 11:27:34 AM UTC
다음은 이것을 사용할 때의 결과입니다. new DateTime(timestamp.getTime());
2013-09-25 11:27:34 AM Asia/Kolkata
그리고 다음은 이것을 사용할 때의 결과입니다 new DateTime(timestamp.getTime(), DateTimeZone.UTC)
.
2013-09-25 05:57:34 AM UTC
LocalDateTime 클래스를 사용할 수 있습니다.
LocalDateTime dt = new LocalDateTime(t.getTime());
및 변환 LocalDateTime
에DateTime
DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC);
Joda DateTime
는 밀리 초 단위의 시간을 " 현재 시간대 에서 1970 년 이후의 밀리 초 "로 처리합니다. 따라서 DateTime
인스턴스를 생성하면 현재 시간대로 생성됩니다.
withZoneRetainFields()
방법을 사용 DateTime
하여 날짜의 숫자를 변경하지 않고 시간대를 변경할 수 있습니다 .
타임 스탬프가 2015-01-01T00 : 00 : 00.000-0500 인 경우 ([나의 경우] 현지 시간)
이 시도:
DateTime localDt = new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
.withZone(DateTimeZone.getDefault());
2014-12-31T19 : 00 : 00.000-05 : 00
분석 : 이것은 타임 스탬프에 해당하는 DateTime을 제공하며 UTC로 지정합니다.
new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
2015-01-01T00 : 00 : 00.000Z
이것은 DateTime을 제공하지만 시간은 현지 시간으로 변환됩니다.
new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
.withZone(DateTimeZone.getDefault());
2014-12-31T19 : 00 : 00.000-05 : 00
방법은 다음과 같습니다.
private DateTime convertLocalToUTC(DateTime eventDateTime) {
// get your local timezone
DateTimeZone localTZ = DateTimeZone.getDefault();
// convert the input local datetime to utc
long eventMillsInUTCTimeZone = localTZ.convertLocalToUTC(eventDateTime.getMillis(), false);
DateTime evenDateTimeInUTCTimeZone = new DateTime(eventMillsInUTCTimeZone);
return evenDateTimeInUTCTimeZone.toDate();
}
나는 같은 문제가 있었다. 이 유용한 답변을 읽은 후 특정 요구 사항과 사용 가능한 개체가 주어지면 다른 DateTime 생성자를 사용하여 문제를 해결했습니다.
new DateTime("2012-04-23T18:25:46.511Z", DateTimeZone.UTC)
주어진 답변 중 실제로 문제를 설명하지 못했습니다. 진짜 문제는 초기 가정이 잘못되었다는 것입니다. 데이터베이스의 타임 스탬프는 Asia/Kolkata
UTC가 아닌 로컬 JVM 시간대를 사용하여 생성되었습니다 . 이것이 JDBC의 기본 동작이므로 JVM 시간대를 UTC로 설정하는 것이 좋습니다.
데이터베이스의 타임 스탬프가 실제로 다음과 같은 경우 :
2013-09-25 11:27:34 AM UTC
또는 ISO-8601 형식 :
2013-09-25T11:27:34Z // The trailing 'Z' means UTC
그런 다음 new DateTime(timestamp, DateTimeZone.UTC)
생성자를 사용하면 정상적으로 작동합니다. 직접 확인 :
Timestamp timestamp = new Timestamp(1380108454000L);
DateTime dt = new DateTime(timestamp.getTime(), DateTimeZone.UTC);
System.out.println(dt); // => 2013-09-25T11:27:34.000Z
내가 어떻게 얻었는지 궁금하다면 1380108454000L
Joda 파싱 클래스를 사용했습니다.
ISODateTimeFormat.dateTimeParser().parseMillis("2013-09-25T11:27:34Z")
또는 날짜, 시간 및 시간대를 입력 할 수있는 온라인 웹 사이트가 있으며 밀리 초 단위로 epoch 값을 반환하거나 그 반대의 경우도 마찬가지입니다. 때로는 온 전성 검사로 좋습니다.
// https://www.epochconverter.com
Input: 1380108454000 Click: "Timestamp to Human Date"
Assuming that this timestamp is in milliseconds:
GMT: Wednesday, September 25, 2013 11:27:34 AM
Also, keep in mind the java.sql.Timestamp
class roughly correlates to the Joda/Java 8+ Instant
class. Sometimes it's easier to convert between equivalent classes to spot bugs like this earlier.
Also i have another approach that was very helpful for me. I wanted to have my workflow thread temporary changed to an specific Timezone (conserving the time), and then when my code finishes, i set the original timezone again. It turns out that when you are using joda libraries, doing:
TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone));
TimeZone.setDefault(timeZone);
It's not enough. We also need to change the TimeZone in DateTimeZone as follows:
@Before
public void setUp() throws Exception {
timeZone = TimeZone.getDefault();
dateTimeZone = DateTimeZone.getDefault();
}
@After
public void tearDown() throws Exception {
TimeZone.setDefault(timeZone);
DateTimeZone.setDefault(dateTimeZone);
}
@Test
public void myTest() throws Exception {
TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone));
DateTimeZone.setDefault(DateTimeZone.forID(myTempTimeZone));
//TODO
// my code with an specific timezone conserving time
}
Hope it helps to somebody else as well.
ReferenceURL : https://stackoverflow.com/questions/19002978/in-joda-time-how-to-convert-time-zone-without-changing-time
'programing' 카테고리의 다른 글
R의 목록 목록에 목록 추가 (0) | 2021.01.19 |
---|---|
"git status"가 터미널에 색상을 출력하도록 강제합니다 (스크립트 내부). (0) | 2021.01.19 |
ASP.NET ID에 클레임을 추가하는 방법 (0) | 2021.01.19 |
"TryParse"방식으로 json 역 직렬화 (0) | 2021.01.19 |
AngularJS 템플릿에서 범위 변수가 정의되지 않았는지 확인하는 방법은 무엇입니까? (0) | 2021.01.19 |