在我的应用程序中,我以 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);
从服务器我正在"2018-02-28 16:04:12"
IST 中获取时间,上面的代码显示"Wed Feb 28 10:34:12 GMT+05:30 2018"
.
另一个答案使用GMT+05:30,但最好使用适当的时区,例如亚洲/加尔各答。它现在可以工作,因为印度目前使用 +05:30 偏移量,但不能保证永远相同。
如果有一天政府决定更改国家的偏移量(过去已经发生过),带有硬编码GMT+05:30的代码将停止工作 - 但带有亚洲/加尔各答的代码(以及更新时区数据的 JVM)将继续工作。
但是今天有一个更好的API来操作日期,请参阅此处如何配置它:如何在Android项目中使用ThreeTenABP
这比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/
更新:通过使用现代 Java8 日期时间 API 的@istt检查此答案。
您不需要先更改 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("Asia/Kolkata"));
localSDF.setTimeZone(TimeZone.getDefault());
String localDate = localSDF.format(serverSDF.parse(dateString));