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

时间:2015-07-13 22:16:20

标签: java calendar

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

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用户本地时间提供Calendar对象的Web服务。然后我需要在服务器端处理这个C​​alendar对象,所以我必须在数据库中查找用户时区,设置它然后在查询数据库时提取小时使用。最终发生的是Calendar.DAY_OF_MONTH和Calendar.HOUR与Calendar对象表示的日期不匹配。总而言之,我希望用户提供一个Calendar对象,设置时区,然后提取正确的小时和天。

1 个答案:

答案 0 :(得分:2)

因为必须使用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));