我需要使用澳大利亚时区创建一个java.util.Date对象。下游组件中使用的标记库需要此对象(因此我遇到了Date)。
以下是我的尝试:
TimeZone timeZone = TimeZone.getTimeZone("Australia/Sydney");
GregorianCalendar defaultDate = new GregorianCalendar(timeZone);
Date date = defaultDate.getTime();
但是,“date”始终返回当前本地时间(在我的情况下,ET)。我在这做错了什么?甚至可以使用不同的时区设置Date对象吗?
更新
感谢您的回复!如果我想将格式化的日期输出为字符串,则此方法有效,但如果我想返回日期对象则不行。例如:
Date d = new Date();
DateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String formattedDate = df.format(d); // returns Sydney date/time
Date myDate = df.parse(formattedDate); // returns local time(ET)
我想我最终会重新修改日期标记库。
答案 0 :(得分:5)
甚至可以使用不同的时区设置Date对象吗?
不,这是不可能的。正如其javadoc所描述的那样,所有java.util.Date
包含的只是纪元时间,它始终是相对于1970年1月1日UTC / GMT的秒数。 Date
不包含其他信息。要使用时区对其进行格式化,请使用SimpleDateFormat#setTimeZone()
答案 1 :(得分:1)
getTime是一个Unix时间,以秒为单位,它没有时区,即它与UTC绑定。您需要将该时间转换为您想要的时区e.b.使用DateFormat。
import java.util.*;
import java.text.*;
public class TzPrb {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
System.out.println(df.format(d));
df.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(df.format(d));
}
}