如何在特定时区打印日期?

How to print a date in a specific time zone?

我之前问过 问题,但我仍然不确定如何解决我的问题。我希望找到设置用户时区的最佳方法,然后在用户时区(而不是服务器本地时区)中提取日期。一些代码会澄清......(注意:这段代码是我的问题的简化)

long t = 1436842840327L;
Calendar c = Calendar.getInstance();
c.setTimeInMillis(t);
c.setTimeZone(TimeZone.getTimeZone("US/Alaska"));
System.out.println(c.getTime());
System.out.println(c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.MILLISECOND));

产出

Mon Jul 13 23:00:40 EDT 2015
19:0:327 //<--- why is hour not 23???

但是我想要它输出

Mon Jul 13 23:00:40 EDT 2015
23:0:327

我有一个 Web 服务,它提供了一个基于 Web 用户本地时间的日历对象。然后我需要在服务器端处理这个 Calendar 对象,所以我必须在数据库中查找用户时区,设置它,然后提取在查询数据库时使用的小时数。最终发生的是 Calendar.DAY_OF_MONTH 和 Calendar.HOUR 都不匹配 Calendar 对象表示的日期。总而言之,我希望用户提供一个日历对象,设置时区,然后提取正确的小时和日期。

因为您绝不能 使用Calendar#toStringDate#toString 来获取日期的字符串表示形式。相反,使用 SimpleDateFormat.

Date yourDate = ...
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("US/Alaska"));
System.out.println(sdf.format(yourDate));