java中的日历在更改时区时返回相同的日期?

时间:2014-12-10 07:38:36

标签: java datetime

我正在开展一个项目,我必须操纵日期。这是我的代码片段 我的时区是IST,转换时区是CST。

public class Sample {
public static Long time = 1418187600l;
public static TimeZone tz1 = TimeZone.getTimeZone("US/Central");


public static void main(String[] args) {
    Calendar c1 = Calendar.getInstance();
    System.out.println(c1.getTime()); // output1 
    c1.setTimeInMillis(time*1000);
    System.out.println(c1.getTime());//output 2
    System.out.println(c1.get(Calendar.DATE));
    c1.setTimeZone(tz1);;
    System.out.println(c1.getTime()); //output 3
    System.out.println(c1.get(Calendar.DATE));
}

}

当我运行该程序时,我得到了

Wed Dec 10 13:03:42 IST 2014

对于正确的行。

然后将时间设置为1418187600,此输出也正确。

Wed Dec 10 10:30:00 IST 2014

但是当将时区设置为CST并尝试输出日期时,它返回相同的

Wed Dec 10 10:30:00 IST 2014

虽然应该已经 2014年12月9日23:00:00

然而,当我尝试Calendar.data时,它显示了正确的日期。任何人都可以向我解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

您正在打印java.util.Date(调用getTime()的结果)。 Date根本不包含时区信息 - Date.toString() 始终显示默认时区中Date所代表的时间点。

基本上,你应该避免打电话给Date.toString() - 这是造成很多混乱的原因。请改用SimpleDateFormat,您可以将其设置为使用特定时区。

或者,如果您使用的是Java 8,则使用java.time类,否则使用Joda Time - 两者都是 更好的选项而不是java.util.Date和{{ 1}}。