Android DateUtils.formatDateTime错误的时区

时间:2016-07-26 16:00:38

标签: android timezone

call set_someclasspaths.bat
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard

结果是:String time = DateUtils.formatDateTime(context, 1469602800000, DateUtils.FORMAT_SHOW_TIME); 符合预期

我当前的时区是:03:00

但我怎样才能得到:“GMT+3:00 DST”如果我无法将时区传递给00:00

我已经尝试过了:

dateformatter

但我得到了相同的结果:“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());

3 个答案:

答案 0 :(得分:2)

我得到DateUtils的解决方案而没有使用像Calendar甚至SimpleDateFormat这样的重物。

// 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")。您可以设置所需的任何时区,例如“太平洋/檀香山”甚至“亚洲/新西伯利亚”。以下是complete list of timezones IDs的链接。

请注意

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

答案 1 :(得分:1)

我遇到了问题。

您正为TimeZone对象设置calendar。但是,您必须将TimeZone设置为SimpleDateFormat。否则,SimpleDateFormat将收到calendar.getTime(),但会在默认的TimeZone中处理。

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

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);

答案 2 :(得分:0)

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

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

使用此格式化程序从Calendar对象返回String应该提供您正在查找的结果。