将印度时区转换为当地时间

时间:2018-02-28 10:53:52

标签: android timezone simpledateformat datetime-format gmt

在我的应用程序中,我在IST时区的API服务器中获取时间,我想在设备的本地时区显示时间。

以下是我的代码,但似乎无效。

SimpleDateFormat serverSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat utcSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat localSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
serverSDF.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
utcSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
localSDF.setTimeZone(TimeZone.getDefault());

Date serverDate = serverSDF.parse(dateString);
String utcDate = utcSDF.format(serverDate);
Date localDate = localSDF.parse(utcDate);

从服务器我在IST获得时间"2018-02-28 16:04:12",上面的代码显示"Wed Feb 28 10:34:12 GMT+05:30 2018"

2 个答案:

答案 0 :(得分:1)

另一个答案使用 GMT + 05:30 ,但使用适当的时区(例如 Asia / Kolkata )要好得多。它现在有效,因为印度目前使用的是+05:30偏移,但不能保证它永远是相同的。

如果有一天政府决定更改国家/地区的偏移量(already happened in the past),那么使用硬编码 GMT + 05:30 的代码将停止工作 - 但代码亚洲/加尔各答(以及JVM with the timezone data updated)将继续发挥作用。

但今天有一个更好的API来操作日期,请参阅此处如何配置它:How to use ThreeTenABP in Android Project

这比SimpleDateFormat更好,这个类已知有很多问题:https://eyalsch.wordpress.com/2009/05/29/sdf/

使用此API,代码为:

String serverDate = "2018-02-28 16:04:12";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime istLocalDate = LocalDateTime.parse(serverDate, fmt);

// set the date to India timezone
String output = istLocalDate.atZone(ZoneId.of("Asia/Kolkata"))
    // convert to device's zone
    .withZoneSameInstant(ZoneId.systemDefault())
    // format
    .format(fmt);

在我的机器中,输出为2018-02-28 07:34:12(根据您环境的默认时区而有所不同)。

虽然学习新API似乎很复杂,但在这种情况下,我认为这是完全值得的。新API更好,更易于使用(一旦您学习了概念),更不容易出错,并解决了旧API的许多问题。

查看Oracle教程以了解有关它的更多信息:https://docs.oracle.com/javase/tutorial/datetime/

答案 1 :(得分:0)

您无需先更改UTC格式。你可以简单地使用:

SimpleDateFormat serverSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat localSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
serverSDF.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
localSDF.setTimeZone(TimeZone.getDefault());

String localDate = localSDF.format(serverSDF.parse(dateString));