在我的应用程序中,我在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"
。
答案 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));