我正在开发一个应用程序,在这个应用程序中,我可以节省帖子发布时的时间。
我使用下面的代码来获取时间:
DateFormat currentTime = new SimpleDateFormat("h:mm a");
final String time = currentTime.format(Calendar.getInstance().getTime());
现在,我想要的是我想要获得用户的时区,并将数据库中使用他/她的时区保存的时间转换为他/她的本地时间。
我尝试使用代码:
public String convertTime(Date d) {
//You are getting server date as argument, parse your server response and then pass date to this method
SimpleDateFormat sdfAmerica = new SimpleDateFormat("h:mm a");
String actualTime = sdfAmerica.format(d);
//Changed timezone
TimeZone tzInAmerica = TimeZone.getDefault();
sdfAmerica.setTimeZone(tzInAmerica);
convertedTime = sdfAmerica.format(d);
Toast.makeText(getBaseContext(), "actual : " + actualTime + " converted " + convertedTime, Toast.LENGTH_LONG).show();
return convertedTime;
}
但是这并没有改变时间
这就是我如何尝试使用上述方法转换数据库中节省的时间(postedAtTime
是从数据库中检索的时间):
String timeStr = postedAtTime;
SimpleDateFormat df = new SimpleDateFormat("h:mm a");
Date date = null;
try {
date = df.parse(timeStr);
} catch (ParseException e) {
e.printStackTrace();
}
convertTime(date);
请让我知道我的代码有什么问题,或者如果这是错误的方式?
您存储的时间字符串不足以在事后更改时区(h:mm a仅是小时、分钟和上午/下午标记)。为了做这样的事情,你需要存储原始时间戳所在的时区,或者更好的是以确定性的方式存储时间,比如总是UTC。
示例代码:
final Date now = new Date();
final String format = "yyyy-MM-dd HH:mm:ss";
final SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
// Convert to UTC for persistence
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
// Persist string to DB - UTC timezone
final String persisted = sdf.format(now);
System.out.println(String.format(Locale.US, "Date is: %s", persisted));
// Parse string from DB - UTC timezone
final Date parsed = sdf.parse(persisted);
// Now convert to whatever timezone for display purposes
final SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm a Z", Locale.US);
displayFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
final String display = displayFormat.format(parsed);
System.out.println(String.format(Locale.US, "Date is: %s", display));
输出Date is: 2016-06-24 17:49:43
Date is: 13:49 PM -0400