2017-08-09 31 views
2

我們正在將Joda-Time API改爲Java 8時間API。在Joda時間,我用過:UTC到Joda-Time的DateTimeZone中的本地方法到Java 8

DateTimeZone.convertLocalToUTC(this.getMillis(), true); 
DateTimeZone.convertUTCToLocal(long millis); 

任何人都可以告訴我在Java 8中的等價方法嗎?

被修改

convertLocalToUTC

DateTimeZone dateTimeZone = DateTimeZone.getDefault(); 
DateTime jodadatetime = new DateTime(); 
long utcTime = dateTimeZone.convertLocalToUTC(jodadatetime .getMillis(), true); 
System.out.println(jodadatetime); 

DateTimeZone dateTimeZone1 = DateTimeZone.UTC; 
System.out.println(new DateTime(utcTime, dateTimeZone1)); 

輸出

2017-08-09T17:27:57.508 + 05:30
2017-08-09T06 :27:57.508Z

ConvertUtcToLocal

long utctolocal = dateTimeZone.convertUTCToLocal(jodadatetime.getMillis()); 
System.out.println("utc to local : " + new DateTime(utctolocal, dateTimeZone1)); 

輸出

2017-08-09T17:27:57.508Z

+1

'convertUTCToLocal'需要'long'作爲參數,而不是'DateTimeZone'。或者我錯過了什麼? – 2017-08-09 09:49:56

+0

@Hugo對不起我的錯誤 – wazza

+0

什麼是默認時區? – 2017-08-09 12:05:07

回答

3

所以,你原來的日期是2017-08-09T17:27:57.508+05:30,那麼你想兩件事情:

  1. convertLocalToUTC:得到2017-08-09T06:27:57.508Z。這是有點棘手:

原始日期是2017-08-09T17:27:57.508+05:30,這是相當於UTC到2017-08-09T11:57:57.508Z。這種方法的作用是將其轉換爲當地的日期和時間,但是在加爾各答時區,然後用UTC打印。總之:

  • 原來的日期是2017-08-09T17:27:57.508+05:30
      在UTC
    • ,這是一樣的2017-08-09T11:57:57.508Z
  • convertLocalToUTC將其轉換爲2017-08-09T11:57:57.508+05:30(同一日期和時間,但在加爾各答時區)
    • 這就和2017-08-09T06:27:57.508Z一樣

在Java中8做到這一點,你可以這樣做:

ZoneId zone = ZoneId.of("Asia/Calcutta"); 
// original date 2017-08-09T17:27:57.508+05:30 
Instant i = OffsetDateTime.parse("2017-08-09T17:27:57.508+05:30") 
    // convert to UTC (2017-08-09T11:57:57.508Z) 
    .atZoneSameInstant(ZoneOffset.UTC) 
    // convert to same local time in Calcutta 
    .withZoneSameLocal(zone) 
    // back to UTC 
    .toInstant(); 
System.out.println(i.toEpochMilli() + "=" + i); 

輸出:

1502260077508 = 2017-08-09T06:27:57.508Z

  1. convertUTCToLocal:get 2017-08-09T17:27:57.508Z - 相同日期(2017-08-09)和時間(17:27:57.508),但採用UTC。

它類似於:

ZoneId zone = ZoneId.of("Asia/Calcutta"); 
// original date 2017-08-09T17:27:57.508+05:30 
ZonedDateTime z = OffsetDateTime.parse("2017-08-09T17:27:57.508+05:30") 
    // convert to a ZonedDateTime in Calcutta (2017-08-09T17:27:57.508+05:30[Asia/Calcutta]) 
    .atZoneSameInstant(zone) 
    // convert to same local time in UTC 
    .withZoneSameLocal(ZoneOffset.UTC); 
System.out.println(z.toInstant().toEpochMilli() + "=" + z); 

輸出:

1502299677508 = 2017-08-09T17:27:57.508Z


你也可以得到來自millis值。

對於情況1:

// millis for original joda date: jodadatetime.getMillis() (1502279877508 = 2017-08-09T17:27:57.508+05:30) 
long millisFromJoda = 1502279877508L; 
Instant instant = Instant.ofEpochMilli(millisFromJoda) 
    // convert to UTC (2017-08-09T11:57:57.508Z) 
    .atZone(ZoneOffset.UTC) 
    // convert to same local time in Calcutta 
    .withZoneSameLocal(zone) 
    // back to UTC 
    .toInstant(); 
System.out.println(instant.toEpochMilli() + "=" + instant); 

輸出:

1502260077508 = 2017-08-09T06:27:57.508Z

可以將Instant轉換爲另一種類型的,如果你想要:

// convert to ZonedDateTime in UTC 
ZonedDateTime zd = instant.atZone(ZoneOffset.UTC); 
// convert to OffsetDateTime in UTC 
OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC); 

兩者都將是2017-08-09T06:27:57.508Z

而對於情況2:

ZonedDateTime zdt = Instant.ofEpochMilli(millisFromJoda) 
    // convert to a ZonedDateTime in Calcutta (2017-08-09T17:27:57.508+05:30[Asia/Calcutta]) 
    .atZone(zone) 
    // convert to same local time in UTC 
    .withZoneSameLocal(ZoneOffset.UTC); 
System.out.println(zdt.toInstant().toEpochMilli() + "=" + zdt); 

輸出:

1502299677508 = 2017-08-09T17:27:57.508Z

+0

對於使用millis的情況1,我想要ZonedDatetime/OffsetDateTime而不是即時。當我嘗試更改即時區域/ OffsetDateTime時間正在更改 – wazza

+0

@wazza我已更新答案 – 2017-08-09 12:50:36

+1

它的工作原理謝謝 – wazza

0

下面是一些代碼片斷,可以幫助你開始:

LocalDateTime yourLocalTime = ... 
long utc = yourLocalTime.toInstant(ZoneOffset.UTC).toEpochMilli(); 

或者你使用strict = true如下:

long utc = ZonedDateTime.ofStrict(yourLocalTime, ZoneOffset.UTC, ZoneId.of("Z")).toInstant().toEpochMilli(); 

轉換回是相似的:

LocalDateTime yourUtcTime = ... 
long localTimeInMillis = yourUtcTime.toInstant(OffsetDateTime.now().getOffset() /* or: yourLocalTime.getOffset() */).toEpochMilli(); 

如果您不需要米利斯,但想用DateTime-工作而不是類,你可能想用ZonedDateTime代替?

創建從一個米利斯LocalDateTime可以做如下:

LocalDateTime yourLocalDateTime = Instant.ofEpochMilli(millisAsLong).atZone(/* your desired zone here */).toLocalDateTime(); 

其中區域ID可能是ZoneId.of("Z")ZoneId.systemDefault()

+0

請參閱我編輯的代碼 – wazza

+0

在我的代碼LocaltoUtc轉換給** ** 2017-08-09T06:50:15.644Z **但我已經使用您的代碼** ZonedDateTime.ofStrict(yourLocalTime,ZoneOffset .UTC,ZoneId.of(「Z」))**它給出** 2017-08-09T17:50:15.582Z ** – wazza