2017-03-27 122 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'这样的过时/过时的类。 –