Java 当午夜在其他时区时获取本地时间

Java 当午夜在其他时区时获取本地时间,java,date,calendar,timezone,Java,Date,Calendar,Timezone,我想知道我的当地时间,在另一个时区的午夜。 我的意思是: 斯德哥尔摩是几点,伦敦是午夜 斯德哥尔摩是几点,赫尔辛基是午夜 这是我的密码 public static void main(String[] args) throws ParseException { DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); formatter.setTimeZone(TimeZone.getTim

我想知道我的当地时间,在另一个时区的午夜。 我的意思是:

  • 斯德哥尔摩是几点,伦敦是午夜
  • 斯德哥尔摩是几点,赫尔辛基是午夜
这是我的密码

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 00:00:00.000
Stockolm: 2013-04-13 01:00:00.000
Helsinki: 2013-04-13 02: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.

试着把一天中的每一个小时换成另一个小时。它似乎是读取时间,一次为上午,一次为下午

更多信息:

日历有两种设置一天中小时数的方法

第一种方式是通过
每天的小时数

resultDate.set(Calendar.HOUR_OF_DAY, 0);
第二种选择是通过“小时”和“上午/下午”

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,斯德哥尔摩),伦敦仍然是前一天(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

您正在使用stockolm时区分析日期:

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-12 13:00:00.000
Helsinki: 2013-04-12 23:00:00.000
London: 2013-04-13 00:00:00.000
Stockolm: 2013-04-13 01:00:00.000
Helsinki: 2013-04-13 02:00:00.000

为什么要从解析斯德哥尔摩时区中的日期开始?这对我来说没有意义。显然,您正在使用
HOUR
字段,您应该在该字段中使用
HOUR\u OF u DAY
。那么,这对您来说有什么意义呢?您不想先在另一时区中选择特定日期的午夜,然后在您的时区中重新解释该时刻吗?你现在所做的并没有达到这个目标。HOUR_OF_DAY解决了HOUR_DAY的问题,但这一天仍然是12,应该是13:“London:2013-04-12 01:00:00.000”试着像这样编辑你的代码:我希望输出在斯德哥尔摩时区,而不是伦敦时区。当然,伦敦是午夜,而伦敦是午夜。但斯德哥尔摩是凌晨1点,伦敦是午夜,这正是我想要得到的。一天中的小时决定了时间,但不是一天。输出仍然是:“伦敦:2013-04-12 01:00:00.000”