【问题标题】:Get local time when midnight in other timezone获取其他时区午夜时的当地时间
【发布时间】: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_DAYHOUR 字段。
  • 那对你有什么意义呢?
  • 您不想先在另一个时区选择特定日期的午夜,然后在您的时区重新解释该时刻吗?你现在所做的并没有达到那个目标。

标签: java date calendar timezone


【解决方案1】:

Calender 有两种设置时间的方法。

第一种方式是通过HOUR_OF_DAY

resultDate.set(Calendar.HOUR_OF_DAY, 0);

第二个选项是通过 'HOUR' 和 'AM_PM'

resultDate.set(Calendar.HOUR, 0);
resultDate.set(Calendar.AM_PM,Calendar.AM);

编辑: 您得到 2013-04-12 的事实是正确的。

您在斯德哥尔摩输入 2013-04-13 00:00:00.000

这与伦敦的 2013-04-12 23:00:00.000 时间相同

然后您将小时重置为 00,在伦敦产生 2013-04-12 00:00:00.000

然后回到斯德哥尔摩时间收益率

2013-04-12 01:00:00.000

当你做测试时(2013-04-13 00:00:00.00 in Stockholm)伦敦还是在前一天(2013-04-12)。

编辑

您可能想知道各个城市的午夜何时出现(以斯德哥尔摩时间表示)。 我会选择这样的:

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"));

    String date = "2013-04-13";
    System.out.println("Stockholm: " + formatter.format(getMidnightTime("Europe/Stockholm", date)));
    System.out.println("London:    " + formatter.format(getMidnightTime("Europe/London", date)));
    System.out.println("Helsinki:  " + formatter.format(getMidnightTime("Europe/Helsinki", date)));
}

public static Date getMidnightTime(String timeZoneId, String date) throws ParseException {
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    formatter.setTimeZone(TimeZone.getTimeZone(timeZoneId));
    return formatter.parse(date);
}


Stockholm: 2013-04-13 00:00:00.000
London:    2013-04-13 01:00:00.000
Helsinki:  2013-04-12 23:00:00.000

【讨论】:

  • HOUR_OF_DAY 修正了小时,但不是日期。输出仍然是:“London: 2013-04-12 01:00:00.000”
【解决方案2】:

您正在使用斯德哥尔摩时区解析日期:

formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));

以及您解析到伦敦时区和赫尔辛基的结果日期:

 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 formatter.setTimeZone(TimeZone.getTimeZone("Europe/London"));
 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)));

结果是:

London: 2013-04-13 00:00:00.000
Helsinki: 2013-04-12 22:00:00.000

请注意,您的格式有 HH,表示从 0 到 23 的小时。

* 编辑 *

在伦敦、斯德哥尔摩和赫尔辛基打发时间:

formatter.setTimeZone(TimeZone.getTimeZone("Europe/London"));
Date date = formatter.parse("2013-04-13 00:00:00.000");

System.out.println("London: " + formatter.format(date));                    
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
System.out.println("Stockolm: " + formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Helsinki"));
System.out.println("Helsinki: " + formatter.format(date));

输出是:

London: 2013-04-13 00:00:00.000
Stockolm: 2013-04-13 01:00:00.000
Helsinki: 2013-04-13 02:00:00.000

【讨论】:

  • 我希望输出在斯德哥尔摩时区,而不是伦敦时区。伦敦的午夜当然是伦敦的午夜。但现在是斯德哥尔摩凌晨 1 点,伦敦是午夜,这就是我想要得到的。
【解决方案3】:

尝试将小时更改为 HOUR_OF_DAY。它似乎读取时间一次作为上午和一次作为下午。

更多信息: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2010-09-27
  • 2018-12-15
  • 2017-08-05
  • 2020-02-05
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多