使用FullName时区时间不正确

时间:2016-06-19 02:30:41

标签: java datetime timezone

我正在尝试使用全名时区将时间从时区转换为另一个时区。下面是我用过的java api。

    TimeZone.setDefault(TimeZone.getTimeZone("Africa/Algiers"));
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
    String dateInString = "09:44:00";
    TimeZone tzGMT01 = TimeZone.getTimeZone("Africa/Algiers");
    formatter.setTimeZone(tzGMT01);

    Date dateInAmerica = formatter.parse(dateInString);
    String fromInput = formatter.format(dateInAmerica);
    TimeZone tzGMT03 = TimeZone.getTimeZone("Asia/Bahrain");
    formatter.setTimeZone(tzGMT03); 

    String toInput = formatter.format(dateInAmerica);
    Time ts = java.sql.Time.valueOf(toInput);

09:44:00时间价值的预期输出转换为"亚洲/巴林"时间是11:44:00。但输出为13:44:00

有人可以指导上述陈述中的错误。

2 个答案:

答案 0 :(得分:2)

您的问题是Java Date是完整日期值,而不仅仅是时间值。如果您未提供年/月/日值,则默认为 1970/01/01

1970年世界不同。Algiers使用UTC + 0时区,Bahrain使用UTC + 4,这与今天的阿尔及尔使用UTC + 1时区不同,巴林正在使用UTC + 3。

忽略日期也会导致夏令时的时区出现问题。

如您所见,日期很重要

以下是显示它的代码:

TimeZone tzAlgiers = TimeZone.getTimeZone("Africa/Algiers");
TimeZone tzBahrain = TimeZone.getTimeZone("Asia/Bahrain");

SimpleDateFormat fmtTimeAlgiers = new SimpleDateFormat("HH:mm:ss");
fmtTimeAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtDatetimeAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
fmtDatetimeAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtFullAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)");
fmtFullAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtFullBahrain = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)");
fmtFullBahrain.setTimeZone(tzBahrain);

Date date1970 = fmtTimeAlgiers.parse("09:44:00");
System.out.println(fmtTimeAlgiers.format(date1970) + "                          " + tzAlgiers.getID());
System.out.println(fmtFullAlgiers.format(date1970) + "   " + tzAlgiers.getID());
System.out.println(fmtFullBahrain.format(date1970) + "   " + tzBahrain.getID());
System.out.println();

Date date2016 = fmtDatetimeAlgiers.parse("2016-01-01 09:44:00");
System.out.println(fmtDatetimeAlgiers.format(date2016) + "               " + tzAlgiers.getID());
System.out.println(fmtFullAlgiers.format(date2016) + "   " + tzAlgiers.getID());
System.out.println(fmtFullBahrain.format(date2016) + "   " + tzBahrain.getID());
System.out.println();

输出

09:44:00                          Africa/Algiers
1970-01-01 09:44:00 CET (+0000)   Africa/Algiers
1970-01-01 13:44:00 AST (+0400)   Asia/Bahrain

2016-01-01 09:44:00               Africa/Algiers
2016-01-01 09:44:00 CET (+0100)   Africa/Algiers
2016-01-01 11:44:00 AST (+0300)   Asia/Bahrain

1970年,时区名称CETAST实际上是错误的。阿尔及尔正在使用GMT,巴林正在使用GST(海湾标准时间)。

答案 1 :(得分:0)

它应该正常运行,I just did an example here使用您为亚洲/巴林提供的时区:

SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date currentTime = new Date();
System.out.println(f.format(currentTime.getTime()));

f.setTimeZone(TimeZone.getTimeZone("Asia/Bahrain"));
System.out.println(f.format(currentTime.getTime()));

SimpleDateForma将正确地完成这个技巧。

这是我的输出:

> 06/18/2016 23:55:13 
> 06/19/2016 05:55:13