programing

Joda 시간에서 시간을 변경하지 않고 시간대를 변환하는 방법

goodcopy 2021. 1. 19. 08:04
반응형

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()); 

및 변환 LocalDateTimeDateTime

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/KolkataUTC가 아닌 로컬 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

내가 어떻게 얻었는지 궁금하다면 1380108454000LJoda 파싱 클래스를 사용했습니다.

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

반응형