首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android DateUtils.formatDateTime时区错误

Android DateUtils.formatDateTime时区错误
EN

Stack Overflow用户
提问于 2016-07-27 00:00:38
回答 3查看 1.3K关注 0票数 5
代码语言:javascript
复制
String time = DateUtils.formatDateTime(context, 1469602800000, DateUtils.FORMAT_SHOW_TIME);

结果是:如预期的那样使用03:00

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

但是,如果我不能将时区传递给dateformatter,我如何获得:"00:00“呢

我已经试过了:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2017-05-18 14:33:32

我没有使用像Calendar甚至SimpleDateFormat这样的重量级对象就得到了DateUtils的解决方案。

代码语言:javascript
复制
// 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();

说明:

如果您查看源代码,就会发现当您调用

代码语言:javascript
复制
formatDateTime(Context context, long millis, int flags)

它返回调用的结果

代码语言:javascript
复制
formatDateRange(context, millis, millis, flags);

其实现方式如下:

代码语言:javascript
复制
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();
}

同样,请看一下

代码语言:javascript
复制
formatDateRange(context, f, startMillis, endMillis, flags)

您将看到以下内容:

代码语言:javascript
复制
return formatDateRange(context, formatter, startMillis, endMillis, flags, null);

如果仔细观察最后一行,您将看到它提供了null作为String timezone参数。因此,根据该方法的注释,它将计算您的本地时区的值。官方文档建议使用Time.TIMEZONE_UTC,但它已被弃用,因此在我的解决方案中,我显式设置了时区(timezoneId = "UTC")。你可以设置任何你需要的时区,例如“太平洋/火奴鲁鲁”,甚至“亚洲/新西伯利亚”。这是一个complete list of timezones IDs的链接。

请注意

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

Stack Overflow用户

发布于 2016-07-27 00:17:39

我有问题了。

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

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

代码语言:javascript
复制
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());

我进行了测试,并且工作正常。

你可以这样做:

代码语言:javascript
复制
SimpleDateFormat dateFormated = new SimpleDateFormat("HH:mm");
dateFormated.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String time = dateFormated.format(1469602800000L);
票数 1
EN

Stack Overflow用户

发布于 2016-07-27 01:17:56

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

代码语言:javascript
复制
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38594746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档