2017-03-27 45 views
0

嗨我有一個表格,我從中得到一個日期,如「2017-03-24 06:01:33」這是UTC。在我的Java程序中,我必須以字符串的形式接收它。如何使用客戶端的偏移小時和分鐘將其轉換爲本地日期字符串?UTC到當地日期轉換

+1

http://stackoverflow.com/questions/31395441/convert-utc-date-to-local-date – soorapadman

回答

2

我會做:

OffsetDateTime odt = LocalDateTime.parse(dateFromDb, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")) 
      .atOffset(ZoneOffset.UTC); 
    String localDateString = odt.atZoneSameInstant(ZoneOffset.ofHoursMinutes(5, 30)) 
      .toLocalDateTime() 
      .toString(); 

我假設你已經得到了客戶的時區作爲一個以小時和分鐘偏移。然後你可以從ZoneOffset.ofHoursMinutes()傳入。請注意,如果客戶時區使用夏季時間(夏令時),一年中的某些時間(如美國大部分地區),則需要確保您獲得日期所在的時間的抵消。指定客戶端時區的其他方式是ZoneId.systemDefault()ZoneId.of("Asia/Kolkata") - 這樣就知道夏令時規則,因此可能更安全。

代碼打印:

2017-03-24T11:31:33 

你注意到它的前面輸入字符串的五個半小時的預期。

如果你只需要日期,而不是時間,使用toLocalDate()代替toLocalDateTime()

所有上述需要Java 8.或Java 8日期和時間類到Java 6和7的反向移植,見ThreeTen Backport。如果你不能使用Java 8並且不想依靠backport,請在this question: Not able to parse UTC date time to EST local time找到你的靈感。

+0

V.V我在哪裏給客戶端的偏移量數據?我希望ZoneOffset.UTC,服務器的抵消? – Virat

+0

我的編輯解釋@Sandesha?你是從客戶端獲取時區字符串,還是如何? –

+0

我得到的是本地抵消分鐘和抵消時間......如果我必須在印度本地顯示「2017-03-24 06:01:33」UTC,我會將印度的抵消時間設置爲5,並將分鐘抵消爲30或如果我必須在美國顯示與當地日期相同的UTC日期,我將獲得美國的偏移時間和分鐘 – Virat

0

使用此

simpleDateFormat.setTimeZone("Your-Client's-Timezone"); 
+0

如何使用它?我應該在哪裏傳遞我的UTC字符串「2017-03-24 06:01:33」以及如何獲取格式爲「yyyy-mm-dd」的本地字符串? @Sandeep – Virat

+0

@Sandesha,你有沒有在Javadocs中檢查SimpleDateFormat? –

+1

在我的愚見中,當提問者可以在Java 8中使用更多程序員友好的日期和時間類時,您不應該建議像'SimpleDateFormat'這樣的過時/過時的類。 –