【发布时间】:2013-04-05 22:53:53
【问题描述】:
我正在尝试获取我的当地时间,当时是不同时区的午夜。 我的意思是:
- 斯德哥尔摩几点钟,伦敦午夜时分?
- 斯德哥尔摩几点钟,赫尔辛基午夜时分?
这是我的代码
public static void main(String[] args) throws ParseException {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
Date date = formatter.parse("2013-04-13 00:00:00.000");
System.out.println("London: " + formatter.format(getFirstInstantOfDay("Europe/London", date)));
System.out.println("Helsinki: " + formatter.format(getFirstInstantOfDay("Europe/Helsinki", date)));
}
public static Date getFirstInstantOfDay(String timeZoneId, Date date) {
Calendar resultDate = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId));
resultDate.setTime(date);
resultDate.set(Calendar.HOUR, 0);
resultDate.set(Calendar.MINUTE, 0);
resultDate.set(Calendar.SECOND, 0);
resultDate.set(Calendar.MILLISECOND, 0);
return resultDate.getTime();
}
输出是:
London: 2013-04-12 13:00:00.000
Helsinki: 2013-04-12 23:00:00.000
我预料到:
London: 2013-04-13 01:00:00.000
Helsinki: 2013-04-12 23:00:00.000
对于赫尔辛基来说,结果符合预期,但对于伦敦来说,这是一个疯狂的结果,我不明白它来自哪里。
-- 编辑 -----
具有预期输出的最终代码:
String dateStr = "2013-04-13";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter.setTimeZone(TimeZone.getTimeZone("Europe/London"));
Date dateGB = formatter.parse(dateStr);
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
Date dateSE = formatter.parse(dateStr);
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Helsinki"));
Date dateFI = formatter.parse(dateStr);
DateFormat stockholmFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
stockholmFormatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
System.out.println("Midnight in London is " + stockholmFormatter.format(dateGB) + " in Stockholm.");
System.out.println("Midnight in Stockholm is " + stockholmFormatter.format(dateSE) + " in Stockholm.");
System.out.println("Midnight in Helsinki is " + stockholmFormatter.format(dateFI) + " in Stockholm.");
输出:
Midnight in London is 2013-04-13 01:00:00.000 in Stockholm.
Midnight in Stockholm is 2013-04-13 00:00:00.000 in Stockholm.
Midnight in Helsinki is 2013-04-12 23:00:00.000 in Stockholm.
【问题讨论】:
-
为什么首先解析斯德哥尔摩时区的日期?这对我来说没有意义。很明显,您正在使用应该使用
HOUR_OF_DAY的HOUR字段。 -
那对你有什么意义呢?
-
您不想先在另一个时区选择特定日期的午夜,然后在您的时区重新解释该时刻吗?你现在所做的并没有达到那个目标。
标签: java date calendar timezone