Android DateUtils.formatDateTime时区错误


String time = DateUtils.formatDateTime(context, 1469602800000, DateUtils.FORMAT_SHOW_TIME);

结果是:03:00如预期

我当前的时区是:GMT+3:00 DST

但是,如果我不能将时区传递给dateformatter,我怎么能得到:"00:00"?

我已经试过了:

TimeZone timeZone = getTimezoneForId("America/Los_Angeles");
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timeZone);
calendar.setTimeInMillis(1469602800000);
String time = new SimpleDateFormat("HH:mm", Locale.getDefault()).format(calendar.getTime());

但我得到了相同的结果:"03:00">

我在不使用Calendar甚至SimpleDateFormat这样重的对象的情况下得到了DateUtils的解决方案。

// Your UTC time in milliseconds:
long timeInMillis = 1469602800000;
// Desired timezone ID:
String timezoneId = "UTC";
java.util.Formatter f = new java.util.Formatter(new StringBuilder(50), Locale.getDefault());
String time = DateUtils.formatDateRange(context, f, timeInMillis, timeInMillis, DateUtils.FORMAT_SHOW_TIME, timezoneId).toString();

解释:

如果你查看源代码,你会发现当你调用时

formatDateTime(Context context, long millis, int flags)

它返回调用的结果

formatDateRange(context, millis, millis, flags);

其实现如下:

public static String formatDateRange(Context context, long startMillis,long endMillis, int flags) {
Formatter f = new Formatter(new StringBuilder(50), Locale.getDefault());
return formatDateRange(context, f, startMillis, endMillis, flags).toString();
}

再次查看的源代码

formatDateRange(context, f, startMillis, endMillis, flags)

您将看到以下内容:

return formatDateRange(context, formatter, startMillis, endMillis, flags, null);

如果仔细查看最后一行,您会发现它提供了null作为String timezone参数。因此,根据该方法的注释,它将计算本地时区的值。官方文档建议使用Time.TIMEZONE_UTC,但这一点已被弃用,因此在我的解决方案中,我明确设置了时区(timezoneId = "UTC"(。您可以设置任何需要的时区,例如"太平洋/火奴鲁鲁",甚至"亚洲/新西伯利亚"。这是一个完整的时区ID列表的链接。

请注意

  1. 如果希望time字符串在特定的语言环境中格式化,请初始化提供该特定语言环境作为初始化参数的Formatter
  2. 所提供的解决方案的好处是time字符串将根据设备的默认区域设置正确格式化。但是,如果您想使用特定的时间表示格式,并且在所有设备上都是一致的,请使用SimpleDateFormat

我遇到了问题。

您正在为calendar对象设置TimeZone。但是,您也必须将TimeZone设置为SimpleDateFormat。否则,SimpleDateFormat将接收calendar.getTime(),但将在您的默认时区中进行处理。

因此,下面的代码将起作用:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
calendar.setTimeInMillis(1469602800000L);
SimpleDateFormat dateFormated = new SimpleDateFormat("HH:mm");
dateFormated.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

String time = dateFormated.format(calendar.getTime());

我测试了一下,效果很好。

你可以做:

SimpleDateFormat dateFormated = new SimpleDateFormat("HH:mm");
dateFormated.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String time = dateFormated.format(1469602800000L);

尝试在SimpleDateFormat上调用setTimeZone(),而不是日历本身:

SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

使用这个格式化程序从Calendar对象返回一个String应该会得到您想要的结果。

相关内容

  • 没有找到相关文章

最新更新